#==============================================================================|
#  ** Script Info                                                              |
#------------------------------------------------------------------------------|
#  * Script Name                                                               |
#    DoubleX RMVXA Enhanced YSA Battle System: Classical ATB                   |
#------------------------------------------------------------------------------|
#  * Functions                                                                 |
#    Be an enhanced version of YSA-CATB with bug fixes and addons integrated   |
#    Features:                                                                 |
#    1. Action Input Events(Core)                                              |
#        You can set something to occur right before/after inputting actions   |
#    2. Action Input Speed(Speed)                                              |
#       You can set some enemys and/or actors with autobattle and/or confusion |
#       to have action input speeds set by you                                 |
#    3. ATB Bar Colors(Core)                                                   |
#       You can set some actors, classes, weapons, armors, enemies and/or      |
#       states to alter their owner's atb bar colors by ways set by you        |
#    4. ATB Clock Window(Clock)                                                |
#       You can set if and how the atb clock info will be shown in battle      |
#    5. ATB Fill Rate(Core)                                                    |
#       You can set some actors, classes, weapons, armors, enemies and/or      |
#       states to alter their owner's atb fill rate by ways set by you         |
#    6. ATB Force Run/Stop(Force)                                              |
#       You can set keys to force the atb clock to run or stop when pressed    |
#       You can also set if and how the atb force status will be shown         |
#    7. ATB Pool(Pool)                                                         |
#       You can set the atb and action points to be shared among the party or  |
#       troop                                                                  |
#       Right now it doesn't support toogling this feature in battles          |
#       (v0.05a+)Right now it doesn't work well with the Gradual Action Points |
#       Gain feature                                                           |
#    8. ATB Reset Events(Core)                                                 |
#       You can set something to occur right before and/or after an atb reset  |
#    9. ATB Reset Value(Core)                                                  |
#       You can set some skill or items to reset their users' atb value by     |
#       values set by You                                                      |
#    10. ATB Turn Type(Core)                                                   |
#        You can set if the turn is based on time, number of actions/battlers  |
#    11. ATB Update Events(Core)                                               |
#        You can set something to occur right before and/or after an atb update|
#    12. Battler Charging Cancellation/Setup/Target Selection Hotkeys(Hotkey)  |
#        You can set hotkeys to call actors/enemies that can input actions, be |
#        targeted or are charging skills/items                                 |
#    13. Battler Cool Down(Cooldown)                                           |
#        You can set some skills or items to cause their users to have to cool |
#        down for a while before their atb bar will be filled again            |
#    14. Battler Order Window(Order)                                           |
#        You can set if and how the battler orders will be shown in battle     |
#    15. Battler Ready SE(SE)                                                  |
#        You can set some battlers to play a se set by users when the battlers |
#        become able to act                                                    |
#    16. Battler Sprite ATB Bars(Bar)                                          |
#        You can set the contents and layouts of the battler sprite atb bars   |
#        and the conditions for them to be shown                               |
#    17. Changing battle systems(Core)                                         |
#        You can change the battle system to any of those supported by         |
#        Yanfly Engine Ace - Ace Battle Engine outside battles                 |
#    18. Cooldown Finish Events(Cooldown)                                      |
#        You can set something to occur right after finishing cooldown normally|
#    19. Countdown States(Countdown)                                           |
#        You can set some states having duration in seconds and conditions     |
#        that trigger actions when they're met                                 |
#    20. (v0.04a+)CTB Replication(Core)                                        |
#        You can set this script to replicate a CTB system by skipping the atb,|
#        charge and cooldown filling times, and the global atb tick clock      |
#    21. Dynamic configuration values(Core)                                    |
#        Almost all user configuration values can be changed by you on the fly |
#    22. Escape/ATB Wait Conditions(Core)                                      |
#        You can set the conditions for party escape and/or the atb clock to   |
#        stop running                                                          |
#    23. Failed Escape Attempt Action Cost(Core)                               |
#        You can set the action costed paid by all party members right after   |
#        a failed escape attempt                                               |
#    24. (v0.05a+)Gradual Action Points Gain(Action)                           |
#        You can set some battlers' action points to be gained 1 by 1 instead  |
#        of gaining all action points at once                                  |
#        Right now it doesn't work well with the ATB Pool feature              |
#    25. Skill/Item Action Cost(Core)                                          |
#        You can set some skills or items to have their own action point       |
#        demands                                                               |
#    26. Skill/Item Cancel(Cancel)                                             |
#        You can cancel party members' charging skill/items                    |
#    27. Skill/Item Charging(Charge)                                           |
#        You can set party escape, some skills or items to demand users to     |
#        charge for a while before executing them                              |
#        You can also set some skills or items requiring charging to demands   |
#        their users to pay the costs after started or finished charging       |
#    28. Start ATB Value(Core)                                                 |
#        You can set some battlers to have their own initial atb values at     |
#        the beginning of a battle under conditions set by you                 |
#    29. Unison Skills(Unison)                                                 |
#        You can set some skills/items to need more than 1 battler to use      |
#        Right now it only supports actor unison skills/items                  |
#    Possibly upcoming features:                                               |
#    1. Action Batch Execution                                                 |
#       You can set some battlers to input and execute more than 1 actions in a|
#       single action input and execution phase respectively                   |
#    2. Multiple ATB Types                                                     |
#       You can set some skills/items to use some ATB types and some other     |
#       skills/items to use some other ATB types                               |
#    3. Premature Discharge                                                    |
#       You can set some skills/items to be able to be prematurely executed    |
#       before it finishes charging under some conditions and trade offs       |
#------------------------------------------------------------------------------|
#  * Terms Of Use                                                              |
#    You shall:                                                                |
#    1. Follow the terms of use of YSA Battle System: Classical ATB            |
#    2. Let your published edits of this script be integrated as parts of it   |
#    3. Keep this script's Script Info part's contents intact                  |
#    You shalln't:                                                             |
#    1. Claim that this script's written by anyone other than DoubleX, his     |
#       aliases, Yami, or his/her aliases                                      |
#    2. Make an edit of this script while saying it isn't                      |
#    3. Make a RMVXA project based on this script's demo while saying it isn't |
#    None of the above applies to Yami or his/her aliases                      |
#------------------------------------------------------------------------------|
#  * Prerequisites                                                             |
#    Scripts:                                                                  |
#    1. Yanfly Engine Ace - Ace Battle Engine                                  |
#    Abilities:                                                                |
#    1. Solid understanding of the active time battle system concepts          |
#    2. Solid understanding of the RMVXA notetag and script call usages        |
#    3. Decent RGSS3 scripting proficiency to fully utilize this script        |
#------------------------------------------------------------------------------|
#  * Instructions                                                              |
#    1. Open the script editor and put this script into an open slot between   |
#       Yanfly Engine Ace - Ace Battle Engine and Main. Save to take effect.   |
#    2. This script can't be used with YSA Battle System: Classical ATB.       |
#    3. Set DEFAULT_BATTLE_SYSTEM in Yanfly Engine Ace - Ace Battle Engine as  |
#       :ecatb to set the default battle system as that of this script.        |
#------------------------------------------------------------------------------|
#  * Author's Notes                                                            |
#    1. Using Yanfly Engine Ace - Ace Core Engine is highly recommended as it  |
#       fixes the force action bug of this script and improve the atb percent  |
#       and action points display in the actor atb bars.                       |
#    2. Using Yanfly Engine Ace - Buff & State Manager is highly recommended as|
#       it displays the states' remaining turns.                               |
#    3. Using Yanfly Engine Ace - Skill Cost Manager is highly recommended as  |
#       it can display the skills/items' action point requirements by using    |
#       <custom cost: skill.ecatb_act_cost[@actor]>.                           |
#    4. Using Cidiomar's Input as well is highly recommended as it lets users  |
#       set custom keymaps, which is useful for features using keyboard inputs.|
#    5. Using DoubleX RMVXA Dynamic Data is highly recommemded as it lets you  |
#       change the notetag values on the fly.                                  |
#       - ecatb_note_strings[note] is an accessor letting you store your new   |
#         notetag values of notetag note.                                      |
#       - reset_ecatb_notes(note) applies the above changes.                   |
#    6. Using DoubleX RMVXA State Counters is highly recommended as it displays|
#       the enemy countdown states.                                            |
#    7. Using DoubleX RMVXA State Triggers is highly recommended as the CATB   |
#       Clear Addon and some features of the CATB Countdown Addon are          |
#       outsourced to that script.                                             |
#    8. This is an advanced complicated script, meaning testings are likely    |
#       needed to comprehend the use of every configuration of this script.    |
#    9. This script can run using the default settings, but you're still highly|
#       recommended to comprehend all user settings of this script.            |
#    10. This script checks and corrects most configuration(but not notetag)   |
#        values, but you're still highly recommended to validate every         |
#        configuration(and notetag) values themselves.                         |
#    11. Using too many and/or complicated notetags and/or configuration values|
#        can cause severe performance issues, especailly on less able machines.|
#------------------------------------------------------------------------------|
#  * FAQ                                                                       |
#    Q1. What's the main difference between ECATB and CATB?                    |
#    A1. 1. The former integrates everything except compatibility fix into 1   |
#           script while the addons and bug fix of the latter are all separate |
#           scripts.                                                           |
#        2. Almost all user settings of the former can be changed on the fly   |
#           easily while lots of the latter are always fixed once set by users |
#           or even just hardcoded.                                            |
#        3. Some notetags of the former lets users do more stuffs than some of |
#           those of the latter.                                               |
#        4. The code structures and documentations of the former are generally |
#           clearer, neater and more logical than those of the latter.         |
#        5. The codes of the former are generally more effective, efficient,   |
#           flexible, maintainable, reliable and robust than the latter.       |
#        6. The former does a more thorough user error checking and corrections|
#           than the latter for most user settings in most cases.              |
#        7. The former generally demands much more from both the users and     |
#           scripters than the latter.                                         |
#        8. Users can't disable addons in the former while they can add and/or |
#           remove the addon of the latter effortlessly.                       |
#        9. The latter outsources little features to other scripts while the   |
#           former does this significantly more heavily.                       |
#    Q2. Some settings need scripting knowledge to use. May you please teach me|
#        scripting?                                                            |
#    A2. You can ask me how to set specific settings to meet your specific     |
#        needs, but it seems to me that there are many good scripting teachers |
#        so you may want to ask them instead of me for learning scripting.     |
#    Q3. Why don't you implement the reverse atb bar feature in this script    |
#        like what Victor Sant did in his atb script?                          |
#    A3. It's implicitly implemented but the feature is still in this script:  |
#        1. Set :ecatb_bar_colors as %Q(Color.new(0, 0, 0, 0),                 |
#           Color.new(0, 0, 0, 0)).                                            |
#           It makes the atb bar invisible.                                    |
#        2. Set :ecatb_base_fill_t as %Q(1 / Graphics.frame_rate).             |
#           It sets the base atb fill rate to be 100% per frame.               |
#        3. Set the charge rate of each skill or item as "x".                  |
#           It makes the skill or item to charge x% atb per frame.             |
#    Q4. Why I'll have to credit Yami but not you when it's your work?         |
#    A4. It's because this script's an edit of CATB and is heavily based on it.|
#        Without Yami's CATB, this script won't exist; Without his term of use |
#        permitting editing his CATB, this script won't exist as well.         |
#    Q5. What's the point of making ECATB when we've CATB?                     |
#    A5. 1. Some users may prefer having everything bundled into a single      |
#           script and that's the main reason for me to make ECATB.            |
#        2. Lets advanced users have much more control and freedom over the    |
#           script settings. ECATB does that at the cost of significantly      |
#           raising the demand of user proficiency, while CATB keeps the       |
#           settings simple at the cost of obviously reducing the settting     |
#           flexibilities.                                                     |
#    Q6. Can you make this script easier for non-scripters to use?             |
#    A6. I tried to make it as easy as I can but right now that's my limit.    |
#    Q7. Why some settings aren't hardcoded when no users would change them?   |
#    A7. If that's really the case, I'll consider making them hardcoded.       |
#    Q8. Why the script configuration part needs to have 2400+ lines?          |
#    A8. That's because this script does need that many lines to let users set |
#        the configurations of this script. You may want to use CATB instead if|
#        you don't need most of this script's configurations.                  |
#    Q9. Why 'Let your published edits of this script be integrated as parts of|
#        it' is included in the terms of use?                                  |
#    A9. 1. It means I want to reserve that right but that doesn't mean I'll   |
#           always do so. I'll never do so without discussing that with you.   |
#           I'll even try to have your permissions beforehand.                 |
#        2. Integrating the edits into this script may perform better in some  |
#           cases. A case-by-case approach will be used for discussing that.   |
#        3. If I didn't reserve that right, things could be chaotic when some  |
#           edits done by some people did conflict with some of the others by  |
#           some other people. Reserving this right can indeed be an insurance.|
#        4. I'll credit you and clearly stating which parts are your work.     |
#------------------------------------------------------------------------------|
#  * Links                                                                     |
#    Script Usage 101:                                                         |
#    1. forums.rpgmakerweb.com/index.php?/topic/32752-rmvxa-script-usage-101/  |
#    2. rpgmakervxace.net/topic/27475-rmvxa-script-usage-101/                  |
#    This script:                                                              |
#    1. [url]http://rpgmaker.net/scripts/549/[/url]                                       |
#    (DoubleX)ECATB Base Formula:                                              |
#    1. [url]http://pastebin.com/PRwkrQKb[/url]                                           |
#    Compatibility Fix:                                                        |
#    1. [url]http://rpgmaker.net/scripts/551/[/url]                                       |
#    Video:                                                                    |
#    1. [url]https://www.youtube.com/watch?v=E692R6s8F0I[/url]                            |
#    2. [url]https://www.youtube.com/watch?v=6E0-X0wbLAM[/url]                            |
#    Demo:                                                                     |
#    - Coming Soon                                                             |
#    Tutorial:                                                                 |
#    - Link included in [url]http://rpgmaker.net/scripts/549/[/url]                       |
#    Mentioned Patreon Supporters:                                             |
#    [url]https://www.patreon.com/posts/71738797[/url]                                    |
#------------------------------------------------------------------------------|
#  * Authors                                                                   |
#    DoubleX:                                                                  |
#    1. This script                                                            |
#    Yami:                                                                     |
#    1. YSA Battle System: Classical ATB                                       |
#------------------------------------------------------------------------------|
#  * Changelog                                                                 |
#    v0.05c(GMT 0600 28-11-2021):                                              |
#    1. Fixed wrong eval of ecatb_battler_scale and uninitialized battler turn |
#       bugs                                                                   |
#    v0.05b(GMT 0200 7-11-2015):                                               |
#    1. Updated (DoubleX)ECATB Base Formula                                    |
#    2. Notetag values are now symbols of methods in the configuration regions |
#    3. Fixed battler order icon not placed correctly when atb >= 100.0 bug    |
#    4. Simplified the party/troop atb pool reset implementations              |
#    5. Updated some outdated documentations                                   |
#    6. Further improved this script's compatibility, efficiency and simplicity|
#    v0.05a(GMT 0400 21-10-2015):                                              |
#    1. Implemented the Gradual Action Points Gain feature                     |
#       - Right now it doesn't work well with the ATB Pool feature             |
#    2. Updated (DoubleX)ECATB Base Formula                                    |
#    3. Added configuration :ecatb_countdown_mib in the added feature COUNTDOWN|
#    4. ecatb_se_ready_act changed to take SE or nil instead of an array       |
#    5. Fixed battler order and se notetags falsely returning nil bug          |
#    6. Fixed undisposed battler atb order icons upon battle end bug           |
#    7. Fixed repeated actor sprite creation bug                               |
#    8. Fixed battler atb order icons not keeping updated upon icon change bug |
#    9. Fixed pre ecatb input act only triggering upon becoming able to act bug|
#    10. Fixed split second countdown interval never updating turns bug        |
#    11. Fixed active actor command window not showing in atb pool mode bug    |
#    12. Fixed enemy atb bar not showing for those having at least 1 state bug |
#    13. Fixed nil cooldown rate when the atb gain rate remain unchanged bug   |
#    14. Fixed false unison charging for non unison skills/items after using   |
#        unison ones bug                                                       |
#    15. Fixed corrupted battler's last skill/item cache bug                   |
#    16. Fixed running the atb frame update upon battle end bug                |
#    17. Fixed non-sync unison cooldown with party/troop atb pool mode bug     |
#    18. Fixed troop atb pool reset not resetting all enemies' atb values bug  |
#    19. Fixed party/troop atb pool reset falsely resetting other members'     |
#        actions bug                                                           |
#        Right now all members' actions will still be reset when the action    |
#        point pool's depleted                                                 |
#    21. Fixed battler ready se not playing when the battler's become able to  |
#        act bug                                                               |
#    22. Debugging this script becomes easier and simpler with the console open|
#    23. Removed some more redundant variables and methods                     |
#    24. Further boosted this script's compactness, correctness, effectiveness,|
#        efficiency, maintainability, readability, robustness and simplicity   |
#    v0.04f(GMT 0400 12-9-2015):                                               |
#    1. Added 3 script calls for notifying changes of new status window methods|
#    2. The battler sprite atb bar methods are now under ECATB_Bar             |
#    3. Fixed issues with clearing/resetting battler blocks twice consecutively|
#    4. Further improved this script's effectiveness, efficiency and robustness|
#    v0.04e(GMT 1500 11-8-2015):                                               |
#    1. Fixed crash upon changing equips outside battles bug                   |
#    2. Fixed triggering pre and post atb reset effects upon battle end bug    |
#    3. Fixed enemy ecatb bar show not working properly bug                    |
#    4. Fixed actors added during battles not properly initialized bug         |
#    5. Fixed disabling party escape if not all party members are movable bug  |
#    6. Fixed failed party escape attempts not cooling down properly bug       |
#    7. Updated the outdated configuration documentations                      |
#    8. Further improved this script's compactness, memory usage and robustness|
#    v0.04d(GMT 1400 1-8-2015):                                                |
#    1. Updated (DoubleX)ECATB Base Formula                                    |
#    2. Changed :color to :atb and %Q(%Q()) to %Q()                            |
#    3. Added configuration :ecatb_bar_multilayer in feature BAR               |
#    4. Changed configuration :ecatb_actor_hotkeys to :ecatb_battler_hotkeys   |
#    5. UNISON_DEFS doesn't have to include method arguments now               |
#    6. Battler bars displayed on their sprites can overlap with status window |
#    7. Added video [url]https://www.youtube.com/watch?v=6E0-X0wbLAM[/url]                |
#    8. Fixed complete freeze upon battle end in the ctb replication mode bug  |
#    9. Fixed actors being inputable without action points in the atb pool mode|
#    10. Fixed uncleared blocks for actors not in the party when saving bug    |
#    11. Fixed unison rules not being properly applied to user's methods bug   |
#    12. Fixed countdown freeze not freezing the countdown clock entirely bug  |
#    13. Fixed notetag value reevaluation not always correctly triggered bug   |
#    14. Further increased this script's compactness, compatibility,           |
#        correctness, effectiveness, efficiency, flexibility, maintainability, |
#        modularity, readability, robustness, simplicity and user-friendliness |
#    v0.04c(GMT 1600 5-7-2015):                                                |
#    1. Fixed duplicate actor sprite creations from other scripts doing so     |
#    2. Fixed executing and/or inputting actions from/to hidden battlers bug   |
#    3. Further increased this script's compactness and efficiency             |
#    4. Removed some more redundant variables and compatibility socket methods |
#    v0.04b(GMT 1600 29-6-2015):                                               |
#    1. Reduced lag right after executing actions with ctb replication         |
#    2. Fixed nil atb bar color bug upon party member change at battle end     |
#    3. Removed some redundant variables and compatibility socket methods      |
#    v0.04a(GMT 0300 27-6-2015):                                               |
#    1. Implemented the CTB Replication feature                                |
#    2. Lets users set if problematic configuration values will be reset       |
#    3. Fixed retrieving nil battler name bug in the help window               |
#    4. Increased this script's compactness and memory performance             |
#    v0.03a(GMT 0900 27-5-2015):                                               |
#    1. Implemented these features:                                            |
#       -  Action Input Events                                                 |
#       -  ATB Reset Events                                                    |
#       -  Cooldown Finish Events                                              |
#    2. Improved this script's efficiency and robustness                       |
#    v0.02d(GMT 0400 25-5-2015):                                               |
#    1. Fixed starting atb value not working bug                               |
#    2. Fixed some typos and outdated stuffs                                   |
#    v0.02c(GMT 1300 15-5-2015):                                               |
#    1. Fixed default atb starting value not working bug                       |
#    2. Fixed nil color upon victory and unexpected change equip results bug   |
#    3. Fixed not clearing battlers' lambdas before calling Marshal bug        |
#    4. Fixed failing to load saved games upon restarting the game bug         |
#    5. Fixed unison method rules not working bug                              |
#    6. Improved the battler cooldown and party escape implementations         |
#    7. Further improved this script's efficiency                              |
#    v0.02b(GMT 1500 12-5-2015):                                               |
#    1. Fixed some typos and outdated stuffs                                   |
#    2. Fixed order battler icon bugs upon adding/removing party members       |
#    v0.02a(GMT 0700 9-5-2015):                                                |
#    1. Implemented the Action Input Speed feature                             |
#    2. Further improved this script's efficiency                              |
#    v0.01b(GMT 1600 4-5-2015):                                                |
#    1. Improved this script's efficiency                                      |
#    v0.01a(GMT 1300 2-5-2015):                                                |
#    1. Implemented the Battler Order Window feature                           |
#    v0.00d(GMT 0800 22-4-2015):                                               |
#    1. Fixed actor auto battle and confusion action not executing properly bug|
#    2. Fixed compatibility methods not being called bug                       |
#    3. Fixed unison charging value reset bug(the charging finishes upon reset)|
#    v0.00c(GMT 1200 18-4-2015):                                               |
#    1. Fixed the atb bar y offset not working bug                             |
#    2. Fixed the faulty example notetag values of <ecatb color: type, num, CX>|
#    3. Found unison charging value reset bug(the charging finishes upon reset)|
#    v0.00b(GMT 0900 15-4-2015):                                               |
#    1. Outsourced the countdown state sprite display to                       |
#       DoubleX RMVXA State Counters                                           |
#    2. Actor atb bars can be displayed on their sprites                       |
#    v0.00a(GMT 1200 9-4-2015):                                                |
#    1. 1st testing version of this script finished                            |
#==============================================================================|

#==============================================================================|
#  ** Notetag Info                                                             |
#     Notetag settings override their corresponding configuration settings     |
#     Search the notetags themselves to navigate between their info and values |
#------------------------------------------------------------------------------|
#  * Actors/Classes/Weapons/Armors/Enemies/States Notetags(in their noteboxes):|
#    1. <ecatb color: type, num, cx>                                           |
#       Sets the color num of atb bar with type being atb, charge or cooldown, |
#       and num being 1or 2 as cx, which can be set in Color Notetag Values    |
#    2. (v0.05a+)<ecatb gradual action gain: gagx>                             |
#       Sets the battler to gradually gain action points instead of gaining its|
#       maximum instantly if gagx, which can be set in Gradual Action Gain     |
#       Notetag Values, returns true                                           |
#    3. <ecatb order battler icon: obix>                                       |
#       Sets the icon representing its battler's order as obix, which can be   |
#       set in Order Battler Icon Notetag Values                               |
#    4. <ecatb order battler opacity: obox>                                    |
#       Sets the opacity of the icon representing its battler's order as obox, |
#       which can be set in Order Battler Opacity Notetag Values               |
#    5. <ecatb order battler scale: obsx>                                      |
#       Sets the scale of the icon representing its battler's order as obsx,   |
#       which can be set in Order Battler Scale Notetag Values                 |
#    6. <ecatb order battler z: obzx>                                          |
#       Sets the z position of the icon representing its battler's order as    |
#       obzx, which can be awr in Order Battler Z Notetag Values               |
#    7. <ecatb rate: rx>                                                       |
#       Sets the atb fill rate of the battler as rx, which can be set in Rate  |
#       Notetag Values                                                         |
#       All rx of all data currently applied to the battler will be used, with |
#       the output of the ith rx being the input of the (i + 1)th rx           |
#    8. <ecatb se ready act: serax>                                            |
#       Sets the se to be played when a battler becomes able to act as serax,  |
#       which can be set in SE Ready Act Notetag Values                        |
#    9. <ecatb speed reduce: srx>                                              |
#       Sets the number of frames an enemy or actor with autobattle and/or     |
#       confusion needs when inputting actions as srx, which can be set in     |
#       Speed Reduce Notetag Values                                            |
#       All srx of all data currently applied to the battler will be used      |
#    10. <ecatb start val: start, svx>                                         |
#        Sets the atb value at the start of the battle as svx, which can be set|
#        in Start Value Notetag Values                                         |
#        start can be either 0, 1 or 2, meaning the notetag will be used in    |
#        normal, preemptive or surprise starts respectively                    |
#        All svx of all data currently applied to the battler will be used     |
#------------------------------------------------------------------------------|
#  * Skill/Item Notetags(in their noteboxes):                                  |
#    1. <ecatb act cost: acx>                                                  |
#       Sets the number of actions needed for the skill/item as acx, which can |
#       be set in Action Cost Notetag Values                                   |
#       Users can't use it if they don't have enough actions                   |
#       Setting acx as 0 means no action point is needed nor will be used      |
#       Setting acx as negative means users will have more actions afterwards  |
#    2. <ecatb charge prior act cost: cpacx>                                   |
#       The skill/item action cost will be paid before and after finished      |
#       charging if cpacx, which can be set in Charge Prior Act Cost Notetag   |
#       Values, returns false and true respectively                            |
#    3. <ecatb charge prior item cost: cpicx>                                  |
#       The skill/item non-action cost will be paid before and after finished  |
#       charging if cpicx, which can be set in Charge Prior Item Cost Notetag  |
#       Values, returns false and true respectively                            |
#    4. <ecatb charge rate: crx>                                               |
#       The skill/item will have to charge with atb fill rate being crx, which |
#       can be set in Charge Rate Notetag Values, before releasing if this     |
#       notetag's used                                                         |
#    5. <ecatb cooldown rate: cdrx>                                            |
#       The battler will have to cool down with atb fill rate being cdrx, which|
#       can be set in Cooldown Rate Notetag Values, after using the skill/item |
#       before the battler's atb will be filled again if this notetag's used   |
#    6. <ecatb force act cost: facx>                                           |
#       The battler will and won't pay the action cost after using the forced  |
#       action if facx, which can be set in Force Action Cost Notetag Values,  |
#       returns false and true respectively                                    |
#    7. <ecatb reset val: rvx>                                                 |
#       Sets the atb value after using the skill/item as rvx, which can be set |
#       in Reset Value Notetag Values                                          |
#       The atb value right after users have no more actions will be the sum of|
#       rvx of all skills/items used before users have no more actions if the  |
#       battler doesn't gain action points gradually                           |
#    8. <ecatb unison actor: uax>                                              |
#       Sets the ids of actors needed to use the skill/item as uax, which can  |
#       be set in Unison Actor Notetag Values                                  |
#       All those actors must be able to use the skill/item                    |
#       They'll charge it with the same charge rate, use it together and have  |
#       a cooldown with the same cooldown rate                                 |
#    9. <ecatb unison actor def: uadx>                                         |
#       Sets the ids of actors used to calculate the result of def as uadx,    |
#       which can be set in Unison Actor Method Notetag Values                 |
#       def must be the symbol of a battler method returning real numbers and  |
#       should be those used in the skill/item's damage formula                |
#       If a method's used in the skill/item's damage formula but doesn't use  |
#       this notetag, its value will be that of the battler inputting the      |
#       skill/item                                                             |
#       Only 1 uadx will be used per def                                       |
#    10. <ecatb unison def rule: udrx>                                         |
#        Sets the calculation rule of def as udrx, which can be set in Unison  |
#        Method Rule Notetag Values                                            |
#        def must be the symbol of a battler method returning real numbers and |
#        should be those used in the skill/item's damage formula               |
#        The rules are used when the skill/item's executing damage             |
#        Only 1 udrx will be used per def                                      |
#    11. <ecatb unison charge rule: ucrx>                                      |
#        Sets the charge rate calculation rule as ucrx, which can be set in    |
#        Unison Charge Rule Notetag Values                                     |
#        The rules are used when the skill/item's charging                     |
#    12. <ecatb unison cooldown rule: ucdrx>                                   |
#        Sets the calculation rule of def as ucdrx, which can be set in Unison |
#        Cooldown Rule Notetag Values                                          |
#        The rules are used when the skill/item's users are cooling down       |
#------------------------------------------------------------------------------|
#  * Enemy/State Notetags(in their noteboxes):                                 |
#    1. <enemy ecatb bar show: kill, bar, percent, act>                        |
#       Sets if the enemy atb bar should be shown with fill percent and action |
#       points                                                                 |
#       The bar won't be shown if kill is true and the enemy isn't killed first|
#       bar, act and percent will be ignored will be above condition is met    |
#       The bar will be shown if bar is true                                   |
#       act and percent will be ignored if bar is false                        |
#       Action points and fill percent will be shown if act and percent are    |
#       true respectively                                                      |
#       Setting the value of an entry as nil means that entry will be ignored  |
#       t, f and n represents true, false and nil values respectively          |
#       The entry with the highest priority will be used if it's not nil       |
#       Enemy's notetags are of the lowest priorities and will never be ignored|
#------------------------------------------------------------------------------|
#  * State Notetags(in their noteboxes):                                       |
#    1. <ecatb countdown interval: cix>                                        |
#       Sets the duration of the state as cix seconds, which  can be set in    |
#       Coundown Interval Notetag Values                                       |
#        All cix of all states currently applied to the battler will be used   |
#==============================================================================|

#==============================================================================|
#  ** Script Call Info                                                         |
#------------------------------------------------------------------------------|
#  * Configuration Settings                                                    |
#    1. $game_system.set_battle_system(system)                                 |
#       - Changes the battle system as system, which is one of those supported |
#         by Yanfly Engine Ace - Ace Battle Engine                             |
#       - It can only be used outside battles                                  |
#    2. $game_system.ecatb_config = val                                        |
#       - Sets the value of :ecatb_config as val                               |
#         Example: $game_system.ecatb_base_fill_t = "$game_variables[x]" sets  |
#                  the value of :ecatb_base_fill_t as that of variable with id |
#                  x                                                           |
#    3. create_ecatb_def(config, validate)                                     |
#       - Updates the corresponding method of configuration config             |
#         That method will be validated if validate is true                    |
#         Example: BattleManager.create_ecatb_def(:ecatb_base_fill_t, true)    |
#                  updates and validates the corresponding method of           |
#                  :ecatb_base_fill_t                                          |
#  * Battler manipulations                                                     |
#    1. ecatb_act_times                                                        |
#       - Returns the number of the current action points                      |
#    2. ecatb_act_times = val                                                  |
#       - Sets the number of the current action points as val                  |
#    3. ecatb_countdown_freeze[state_id]                                       |
#       - Returns if the countdown of state with id state_id is frozen         |
#    4. ecatb_countdown_freeze[state_id] = val                                 |
#       - Sets if the duration in turns of a countdown state with id state_id  |
#         will be frozen                                                       |
#    5. ecatb_note_change[note] = true                                         |
#       - Notifies at least a value of a notetag with type note of a data used |
#         by the battler has changed                                           |
#       - note can be :act, :atb, :charge, :cooldown, :order_icon,             |
#         :order_opacity,:order_scale, :order_z, :rate, :se, :speed, :start_0, |
#         :start_1, :start_2, meaning gradual action gain, charge rate,        |
#         bar color, cooldown rate, order icon, order opacity, order scale,    |
#         order z, atb gain rate, speed reduce, battler ready se and start     |
#         value notetags with normal, preemptive and surprise start types      |
#         respectively                                                         |
#       - This script call can also be used to change the charge, cooldown, atb|
#         gain rate and bar colors per frame when it's called per frame        |
#    6. ecatb_reset(reset)                                                     |
#       - Cancels the battler's charging actions                               |
#       - The battler's atb and action points will be reset as well if reset   |
#         is true                                                              |
#    7. ecatb_rate[type]                                                       |
#       Returns the atb gain rate with type type                               |
#       - type can be either :atb, :charge or :cooldown, meaning normal,       |
#         charge and cooldown atb types respectively                           |
#    8. ecatb_val[type]                                                        |
#       Returns the atb value with type type                                   |
#       - type can be either :atb, :charge or :cooldown, meaning normal,       |
#         charge and cooldown atb types respectively                           |
#    9. ecatb_val[type] = val                                                  |
#       - Sets the atb value with type type as val                             |
#       - type can be either :atb, :charge or :cooldown, meaning normal,       |
#         charge and cooldown atb types respectively                           |
#  * Party/Troop manipulations                                                 |
#    1. ecatb_pool = enable                                                    |
#       - Converts all actors/enemies' atb into a party/troop atb if enable is |
#         true and vice versa if enable is false                               |
#       - It can't be used in battles                                          |
#  * Hotkey manipulations                                                      |
#    1. SceneManager.scene.set_ecatb_battler_window_handlers                   |
#       - Creates all battler target selection hotkey handlers                 |
#       - It can only be used in battles                                       |
#    2. SceneManager.scene.set_ecatb_actor_command_window_handlers             |
#       - Creates all inputable actor setup hotkey handlers                    |
#       - It can only be used in battles                                       |
#    3. SceneManager.scene.create_ecatb_cancel_window                          |
#       - Creates all charging actor cancellation hotkey handlers              |
#       - It can only be used in battles                                       |
#  * Window manipulations                                                      |
#    1. SceneManager.scene.create_ecatb_clock_window                           |
#       - Creates the atb clock window if :show_ecatb_clock_window returns     |
#         true                                                                 |
#       - It can only be used in battles                                       |
#    2. SceneManager.scene_close_ecatb_clock_window                            |
#       - Closes the atb clock window                                          |
#       - It can only be used in battles with an atb clock window              |
#    3. SceneManager.scene.ecatb_clock_window.update_text_xy                   |
#       - Updates the atb clock window text x and y positions                  |
#       - It can only be used in battles having an atb clock window            |
#    4. SceneManager.scene.ecatb_clock_window.update_pos                       |
#       - Updates the atb clock window x, y and z positions                    |
#       - It can only be used in battles having an atb clock window            |
#    5. SceneManager.scene.ecatb_clock_window.update_wh                        |
#       - Updates the atb clock window width and height                        |
#       - It can only be used in battles having an atb clock window            |
#    6. SceneManager.scene.ecatb_clock_window.update_text_font                 |
#       - Updates the atb clock window text color and size                     |
#       - It can only be used in battles having an atb clock window            |
#    7. SceneManager.scene.ecatb_clock_window.clock_bar.update_bar_colors      |
#       - Updates the atb clock window bar colors                              |
#       - It can only be used in battles having an atb clock window            |
#    8. SceneManager.scene.ecatb_clock_window.clock_bar.update_bar_wh          |
#       - Updates the atb clock window bar width and height                    |
#       - It can only be used in battles having an atb clock window            |
#    9. SceneManager.scene.ecatb_clock_window.clock_bar.update_bar_xy          |
#       - Updates the atb clock window bar x and y positions                   |
#       - It can only be used in battles having an atb clock window            |
#    10. SceneManager.scene.ecatb_clock_window.refresh                         |
#        - Refreshes the atb clock window bar and text                         |
#        - It can only be used in battles having an atb clock window           |
#    11. SceneManager.scene.create_ecatb_force_window                          |
#        - Creates the atb force window if :show_ecatb_force_window returns    |
#          true                                                                |
#        - It can only be used in battles                                      |
#    12. SceneManager.scene.close_ecatb_force_window                           |
#        - Closes the atb force window                                         |
#        - It can only be used in battles with an atb force window             |
#    13. SceneManager.scene.ecatb_force_window.update_pos                      |
#        - Updates the atb force window x, y and z positions                   |
#        - It can only be used in battles having an atb force window           |
#    14. SceneManager.scene.ecatb_force_window.update_wh                       |
#        - Updates the atb force window width and height                       |
#        - It can only be used in battles having an atb force window           |
#    15. SceneManager.scene.ecatb_force_window.update_text_font                |
#        - Updates the atb force window text color and size                    |
#        - It can only be used in battles having an atb force window           |
#    16. SceneManager.scene.ecatb_force_window.update_text                     |
#        - Updates the atb force window text                                   |
#        - It can only be used in battles having an atb force window           |
#    17. SceneManager.scene.ecatb_force_window.update_text_xy                  |
#        - Updates the atb force window text x and y positions                 |
#        - It can only be used in battles having an atb force window           |
#    18. SceneManager.scene.ecatb_force_window.draw_text                       |
#        - Draws the atb force window text                                     |
#        - It can only be used in battles having an atb force window           |
#    19. SceneManager.scene.create_ecatb_order_window                          |
#        - Creates the atb pool window if :show_ecatb_order_window returns true|
#        - It can only be used in battles                                      |
#    20. SceneManager.scene.close_ecatb_order_window                           |
#        - Closes the atb order window                                         |
#        - It can only be used in battles with an atb order window             |
#    21. SceneManager.scene.ecatb_order_window.draw_bars                       |
#        - Draws the atb order bars and text                                   |
#        - It can only be used in battles with an atb order window             |
#    22. SceneManager.scene.ecatb_pool_window.update_pos                       |
#        - Updates the atb pool window x, y and z positions                    |
#        - It can only be used in battles having an atb pool window            |
#    23. SceneManager.scene.ecatb_pool_window.update_wh                        |
#        - Updates the atb pool window width and height                        |
#        - It can only be used in battles having an atb pool window            |
#    24. SceneManager.scene.ecatb_pool_window.update_text_font                 |
#        - Updates the atb pool window text color and size                     |
#        - It can only be used in battles having an atb pool window            |
#    25. SceneManager.scene.create_ecatb_pool_window                           |
#        - Creates the atb pool window if :show_ecatb_pool_window returns true |
#        - It can only be used in battles                                      |
#    26. SceneManager.scene.close_ecatb_pool_window                            |
#        - Closes the atb pool window                                          |
#        - It can only be used in battles with an atb pool window              |
#    27. SceneManager.scene.ecatb_pool_window.update_pos                       |
#        - Updates the atb pool window x, y and z positions                    |
#        - It can only be used in battles having an atb pool window            |
#    28. SceneManager.scene.ecatb_pool_window.update_wh                        |
#        - Updates the atb pool window width and height                        |
#        - It can only be used in battles having an atb pool window            |
#    29. SceneManager.scene.ecatb_pool_window.update_text_font                 |
#        - Updates the atb pool window text color and size                     |
#        - It can only be used in battles having an atb pool window            |
#    30. SceneManager.scene.ecatb_pool_window.update_text_xy                   |
#        - Updates the atb pool window text x and y positions                  |
#        - It can only be used in battles having an atb pool window            |
#    31. SceneManager.scene.ecatb_pool_window.draw_text                        |
#        - Draws the atb pool window text                                      |
#        - It can only be used in battles having an atb pool window            |
#    32. (v0.04f+)SceneManager.scene.status_window.ecatb_text_change = true    |
#        - Notifies that the atb bar text format's changed                     |
#        - It can only be used in battles                                      |
#    33. (v0.04f+)SceneManager.scene.status_window.ecatb_word_change = true    |
#        - Notifies that the atb bar description word's changed                |
#        - It can only be used in battles                                      |
#    34. (v0.04f+)SceneManager.scene.status_window.ecatb_y_add_change = true   |
#        - Notifies that the atb bar y offset's changed                        |
#        - It can only be used in battles                                      |
#==============================================================================|

($doublex_rmvxa ||= {})[:ECATB] = "v0.05c"

#==============================================================================|
#  ** Script Configurations                                                    |
#     You only need to edit this part as it's about what this script does      |
#------------------------------------------------------------------------------|

module DoubleX_RMVXA

  module ECATB

    # Sets if configuration values that can crash the game will be rescued
    # If it's set as true, players will be informed that the values of those
    # configurations are invalid and will be reset to their default ones
    # If it's set as false, the game will crash and the error log will be shown
    # It can't be changed once set
    # Example: To let invalid configuration values crash the game to have the
    #          error log, set this as false
    RESCUE_CONFIG_VAL = true

    # (v0.04a+)Sets if configuration values that are invalid or can crash the
    # game will be reset to their defaults
    # It can't be changed once set
    # Example: To reset invalid or faulty configuration values to their
    #          defaults, set this as true
    RESET_CONFIG_VAL = true

    # Sets if the text showing an invalid or faulty configuration value will be
    # displayed right after checking them
    # It can't be changed once set
    # Example: To silently reset invalid or faulty configuration values, set
    #          this as true
    SUPPRESS_RESET_CONFIG_VAL_TEXT = false

  #----------------------------------------------------------------------------|
  #  * Core                                                                    |
  #    Setups configurations and notetag values of the core features           |
  #----------------------------------------------------------------------------|

    #--------------------------------------------------------------------------|
    #  Color Notetag Values                                                    |
    #  - Setups cx used by <ecatb color: type, num, cx> notetags               |
    #--------------------------------------------------------------------------|
    # cx are read at:
    # 1. RPG::Actor, RPG::Class, RPG::EquipItem, RPG::Enemy, RPG::State
    #    - next @ecatb_notes[$1.downcase.to_sym][$2.to_i] ||= $3.downcase.to_sym
    #      in load_ecatb_notes
    # cx are used at:
    # 1. Game_BattlerBase
    #    - @ecatb_notes[note][0] ||= ecatb.send(n, self) if n and 
    #    - @ecatb_notes[note][1] ||= ecatb.send(n, self) in
    #      set_ecatb_bar_color_notes
    # cx are strings of names of methods under DoubleX_RMVXA::ECATB
    # cx must return an array of colors
    # cx names can only use alphanumeric characters and can't use uppercase
    # letters
    # battler is the battler calling the cx
    # The below cx are examples added to help you set your cx
    # You can freely use, rewrite and/or delete these examples

    # Sets the atb bar colors as text color c and r, g, b, a rgba values
    def self.c1(battler)
      Colour.text_colour(c)
    end

    # Sets the atb bar colors as r, g, b, a rgba values
    def self.c2(battler)
      Color.new(r, g, b, a)
    end

    # Adds new cx here
    

    #--------------------------------------------------------------------------|
    #  Rate Notetag Values                                                     |
    #  - Setups rx used by <ecatb rate: rx> notetags                           |
    #--------------------------------------------------------------------------|
    # rx are read at:
    # 1. RPG::Actor, RPG::Class, RPG::EquipItem, RPG::Enemy, RPG::State
    #    - next @ecatb_notes[:rate] << $1.downcase.to_sym in load_ecatb_notes
    # rx are used at:
    # 1. Game_BattlerBase
    #    - base[:val] = ecatb.send(note, self, base) in set_ecatb_gain_rate
    # rx are strings of names of methods under DoubleX_RMVXA::ECATB
    # rx must return a real number and should return a floating-point number
    # rx names can only use alphanumeric characters and can't use uppercase
    # letters
    # battler is the battler calling the rx
    # The base atb rate can be referenced by base[:val]
    # The number of battlers counted for method sums can be referenced by
    # base[:size]
    # The method sum of all battlers counted can be referneced by
    # base[:sum][method_name]
    # method_name must be included in :ecatb_battlers_def_sum
    # The below rx are examples to help you set your rx
    # You can freely use, rewrite and/or delete these examples

    # Mutliplies the atb fill rate by the battler's agi / all battlers'
    # average agi
    # all battlers is the value of :def_sum_battlers
    def self.r1(battler, base)
      base[:val] * battler.agi * base[:size] / base[:sum][:agi]
    end

    # Sets the atb fill rate as x% per frame
    def self.r2(battler, base)
      x
    end

    # Sets the atb fill rate as the value of variable with id x * 100% per frame
    def self.r3(battler, base)
      $game_variables[x]
    end

    # Adds new rx here
    

    #--------------------------------------------------------------------------|
    #  Start Value Notetag Values                                              |
    #  - Setups svx used by <ecatb start val: start, svx> notetags             |
    #--------------------------------------------------------------------------|
    # svx are read at:
    # 1. RPG::Actor, RPG::Class, RPG::EquipItem, RPG::Enemy, RPG::State
    #    - next @ecatb_notes[("start_" + $1).to_sym] << $2.downcase.to_sym in
    #      load_ecatb_notes
    # svx are used at:
    # 1. Game_BattlerBase
    #    - ecatb.send(note, self) in set_ecatb_start_val
    # svx are strings of names of methods under DoubleX_RMVXA::ECATB
    # svx must return a non-negative real number and should return a
    # non-negative floating-point number
    # svx names can only use alphanumeric characters and can't use uppercase
    # letters
    # battler is the battler calling the svx
    # The below svx are examples added to help you set your svx
    # You can freely use, rewrite and/or delete these examples

    # Sets the starting atb value as x%
    def self.sv1(battler)
      battler.ecatb_val[:atb] = x
    end

    # Sets the atb value as that of variable with id x * 100%
    def self.sv2(battler)
      battler.ecatb_val[:atb] = $game_variables[x]
    end

    # Adds the atb starting value by x%
    def self.sv3(battler)
      battler.ecatb_val[:atb] += x
    end

    # Adds new svx here
    

    #--------------------------------------------------------------------------|
    #  Action Cost Notetag Values                                              |
    #  - Setups acx used by <ecatb act cost: acx> notetags                     |
    #--------------------------------------------------------------------------|
    # acx are read at:
    # 1. RPG::UsableItem
    #    - send(:"#{note}=", send(:"#{note}") || val) in load_ecatb_notes
    # acx are used at:
    # 1. Game_BattlerBase
    #    - return false if @ecatb_val[:charge] <= 0.0 && @ecatb_act_times < 
    #      ecatb.send(item.ecatb_act_cost, self) in usable?
    # 2. Game_Battler
    #    - cost = DoubleX_RMVXA::ECATB.send(item.ecatb_act_cost, self) in
    #      pay_ecatb_act_cost
    #    - cost = (ecatb = DoubleX_RMVXA::ECATB).send(item.ecatb_act_cost, self)
    #      in ecatb_unison_actor?
    # 3. Window_ItemList
    #    - return battler.usable?(item) if (ecatb = DoubleX_RMVXA::ECATB).send(
    #      item.ecatb_act_cost, battler) > 1 || ecatb.send(
    #      item.ecatb_unison_actor, battler).size > 1 in enable?
    # acx are strings of names of methods under DoubleX_RMVXA::ECATB
    # acx must return a real number and should return a non-random integer
    # acx names can only use alphanumeric characters and can't use uppercase
    # letters
    # battler is the battler calling the acx
    # The below acx are examples added to help you set your acx
    # You can freely use, rewrite and/or delete these examples

    # Sets the action cost as x
    def self.ac1(battler)
      x
    end

    # Sets the action cost as the value of variable with id x
    def self.ac2(battler)
      $game_variables[x]
    end

    # Adds new acx here
    

    # Sets the number of action points needed to execute actions
    # It'll be used only if no acx are used
    # It must return a real number and should return a non-random integer
    # battler is the battler calling ecatb_act_cost
    # Example: To set the number of action points needed to execute actions as
    #          the value of variable with id x, set this as 
    #          %Q($game_variables[x])
    def self.ecatb_act_cost(battler)
      1
    end

    #--------------------------------------------------------------------------|
    #  Force Action Cost Notetags Values                                       |
    #  - Setups facx used by <ecatb force act cost: facx> notetags             |
    #--------------------------------------------------------------------------|
    # facx are read at:
    # 1. RPG::UsableItem
    #    - send(:"#{note}=", send(:"#{note}") || val) in load_ecatb_notes
    # facx are used at:
    # 1. Game_BattlerBase
    #    - if (force_act_cost = ecatb.send(item.ecatb_force_act_cost, self)) ||
    #      !forced in exec_ecatb_act_cost
    # facx are strings of names of methods under DoubleX_RMVXA::ECATB
    # facx names can only use alphanumeric characters and can't use uppercase
    # letters
    # battler is the battler calling the facx
    # The below facx are examples added to help you set your facx
    # You can freely use, rewrite and/or delete these examples

    # Sets the force action cost as true
    def self.fac1(battler)
      true
    end

    # Sets the force action cost as false
    def self.fac2(battler)
      false
    end

    # Sets the force action cost as the state of switch with id x
    def self.fac3(battler)
      $game_switches[x]
    end

    # Adds new facx here
    

    # Sets if force actions cost action points
    # It'll be used only if no facx are used
    # battler is the battler calling ecatb_force_act_cost
    # Example: To set force actions to cost action points if switch with id x is
    #          on, set this as %Q($game_switches[x])
    def self.ecatb_force_act_cost(battler)
      false
    end

    #--------------------------------------------------------------------------|
    #  Reset Value Notetags Values                                             |
    #  - Setups rvx used by <ecatb reset val: rvx> notetags                    |
    #--------------------------------------------------------------------------|
    # rvx are read at:
    # 1. RPG::UsableItem
    #    - send(:"#{note}=", send(:"#{note}") || val) in load_ecatb_notes
    # rvx are used at:
    # 1. Game_BattlerBase
    #    - @ecatb_reset_val = (ecatb = DoubleX_RMVXA::ECATB).send(val, self) in
    #      set_ecatb_reset_val
    # rvx are strings of names of methods under DoubleX_RMVXA::ECATB
    # rvx must return a real number and should return a floating-point number
    # rvx names can only use alphanumeric characters and can't use uppercase
    # letters
    # battler is the battler calling the rvx
    # The below rvx are examples added to help you set your rvx
    # You can freely use, rewrite and/or delete these examples

    # Sets the atb reset value as x%
    def self.rv1(battler)
      x
    end

    # Sets the atb reset value as the value of variable with id x * 100%
    def self.rv2(battler)
      $game_variables[x]
    end

    # Adds the atb reset value by x%
    def self.rv3(battler)
      battler.ecatb_reset_val + x
    end

    # Adds new rvx here
    

    # Sets the atb reset value after using a skill/item
    # It'll be used only if no rvx are used
    # It must return a real number and should return a floating-point number
    # battler is the battler calling ecatb_reset_val
    # Example: To set the atb reset value as x%, set this as %Q(x)
    def self.ecatb_reset_val(battler)
      battler.set_gradual_ecatb_act_gain ? battler.ecatb_val[:atb] : 0.0
    end

    #--------------------------------------------------------------------------|
    #  Escape Initialization Condition Configurations                          |
    #  - Setups EICX used by :ecatb_esc_init_cond                              |
    #--------------------------------------------------------------------------|
    # EICX are used at:
    # 1. BattleManager
    #    - init_ecatb_escape if @ecatb_can_esc && ecatb_esc_init_cond in
    #      process_escape
    # EICX are strings of RGSS3 codes
    # EICX names can only use alphanumeric characters
    # The below EICX are examples added to help you set your EICX
    # You can freely use, rewrite and/or delete these examples

    # Checks if the member can pay the escape action cost
    EIC1 = -> mem { mem.ecatb_act_times >= mem.ecatb_esc_act_cost }

    # Adds new EICX here
    

    #--------------------------------------------------------------------------|
    #  Escape Charge Condition Configurations                                  |
    #  - Setups ECCX used by :ecatb_esc_charge_cond                            |
    #--------------------------------------------------------------------------|
    # ECCX are used at:
    # 1. BattleManager
    #    - return pay_ecatb_esc_cost unless ecatb_esc_charge_cond in
    #      ecatb_update
    # ECCX are strings of RGSS3 codes
    # ECCX names can only use alphanumeric characters
    # The below ECCX are examples added to help you set your ECCX
    # You can freely use, rewrite and/or delete these examples

    # Checks if the member is charging the party escape
    ECC1 = -> mem { mem.ecatb_esc }

    # Adds new ECCX here
    

    #--------------------------------------------------------------------------|
    #  Escape Execution Condition Configurations                               |
    #  - Setups EECX used by :ecatb_esc_exec_cond                              |
    #--------------------------------------------------------------------------|
    # EECX are used at:
    # 1. BattleManager
    #    - ecatb_esc_suc if ecatb_esc_exec_cond in ecatb_update
    # EECX are strings of RGSS3 codes
    # EECX names can only use alphanumeric characters
    # The below EECX are examples added to help you set your EECX
    # You can freely use, rewrite and/or delete these examples

    # Checks if the member has fully charged a skill/item
    EEC1 = -> mem { mem.ecatb_val[:charge] >= 100.0 }

    # Adds new EECX here
    

    #--------------------------------------------------------------------------|
    #  Wait Condition Configurations                                           |
    #  - Setups WCX used by :ecatb_wait_cond                                   |
    #--------------------------------------------------------------------------|
    # WCX are used at:
    # 1. Scene_Battle
    #    - BattleManager.phase && !ecatb_wait_cond in ecatb_update?
    # WCX are strings of RGSS3 codes
    # WCX names can only use alphanumeric characters
    # The below WCX are examples added to help you set your WCX
    # Your can freely use, rewrite and/or delete these examples

    # Checks if the atb clock is forced to stop
    WC1 = %Q(@ecatb_force_clock == :stop)

    # Checks if the atb clock isn't forced to run
    WC2 = %Q(@ecatb_force_clock != :run)

    # Checks if an action's executing
    WC3 = %Q(!BattleManager.ecatb_can_esc)

    # Checks if the cancel window's active
    WC4 = %Q(@ecatb_cancel_window && @ecatb_cancel_window.active)

    # Checks if the party command window's active
    WC5 = %Q(@party_command_window.active)

    # Checks if the actor target window's active
    WC6 = %Q(@actor_window.active)

    # Checks if the enemy target window's active
    WC7 = %Q(@enemy_window.active)

    # Checks if the skill window's active
    WC8 = %Q(@skill_window.active)

    # Checks if the item window's active
    WC9 = %Q(@item_window.active)

    # Checks if the actor command window's active
    WC10 = %Q(@actor_command_window.active)

    # Checks if the combat log window's visible
    WCC1 = %Q(update_msg_open_ecatb_compatibility?)

    # Adds new WCX here
    

    #--------------------------------------------------------------------------|
    #  Core Configurations                                                     |
    #  - Setups the configurations of the core features                        |
    #  - The value of each configuration is the string of the content of its   |
    #    corresponding method                                                  |
    #--------------------------------------------------------------------------|

    CORE = {

      # Sets the conditions for initializing party escape
      # A party escape is first initialized, then charged, and finally executed
      # An executed party escape can either success or fail
      # Its corresponding method's created under BattleManager
      # Party Escape can't be initialized nor executed while executing an action
      # Example: To demand at least 1 inputable party member that can pay the
      #          party escape cost, set this as
      #          %Q(ecatb_input_list.any?(&DoubleX_RMVXA::ECATB::EIC1))
      :ecatb_esc_init_cond => %Q((list = ecatb_input_list).size >= $game_party.
                 battle_members.size && list.all?(&DoubleX_RMVXA::ECATB::EIC1)),

      # Sets the conditions for continuing to charge the party escape
      # A party escape is first initialized, then charged, and finally executed
      # An executed party escape can either success or fail
      # Its corresponding method's created under BattleManager
      # Example: To demand a key with mapping :KEY to be pressed and at least 1
      #          party member to continue charging the party escape, set this as
      #          %Q(Input.press?(:KEY) && 
      #             $game_party.members.any?(&DoubleX_RMVXA::ECATB::ECC1))
      :ecatb_esc_charge_cond => %Q($game_party.battle_members.all?(
                                   &DoubleX_RMVXA::ECATB::ECC1)),

      # Sets the conditions for executing party escape
      # A party escape is first initialized, then charged, and finally executed
      # An executed party escape can either success or fail
      # Its corresponding method's created under BattleManager
      # Example: To demand at least 1 party member to finish charging the party
      #          escape before executing it, set this as
      #          %Q($game_party.members.any?(&DoubleX_RMVXA::ECATB::EEC1))
      :ecatb_esc_exec_cond => %Q($game_party.alive_members.all?(
                                 &DoubleX_RMVXA::ECATB::EEC1)),

      # Sets the conditions for successful party escape
      # A party escape is first initialized, then charged, and finally executed
      # An executed party escape can either success or fail
      # Its corresponding method's created under BattleManager
      # Example: To check the preemptive status or use escape ratio as the 
      #          success probability and have at least 1 party member being able
      #          to pay the party escape cost, set this as
      #          %Q((@preemptive || rand < @escape_ratio) && 
      #             $game_party.alive_members.any?(&DoubleX_RMVXA::ECATB::EIC1))
      :ecatb_esc_suc_cond => %Q((@preemptive || rand < @escape_ratio) && 
                   $game_party.alive_members.all?(&DoubleX_RMVXA::ECATB::EIC1)),

      # Sets the atb clock wait condition
      # Its corresponding method's created under Scene_Battle
      # The atb clock will always wait if the game message is visible
      # Only 1 action can be executed at a time
      # Example: To run the atb clock if switch with id x is on, set this as
      #          %Q($game_switches[x])
      :ecatb_wait_cond => %Q(#{WC1} || #{WC2} && (#{WC3} || #{WC4} || #{WC5} || 
                             #{WC6} || #{WC7} || #{WC8} || #{WC9} || #{WC10} || 
                             #{WCC1})),

      # Sets the base atb fill time in seconds
      # Its corresponding method's created under BattleManager
      # It must return a positive real number
      # Example: To set the base atb fill time as 1 frame, set this as
      #          %Q(1 / Graphics.frame_rate)
      :ecatb_base_fill_t => %Q(10),

      # Sets the turn type
      # Its corresponding method's created under Scene_Battle
      # It must return either :tick, :battler or :act
      # :tick means turn length's controlled by the number of ticks
      # :battler means turn length is controlled by the number of battlers
      # :act means turn length's controlled by the number of actions executed
      # Example: To set the atb turn type as :act, set this as %Q(:act)
      :ecatb_turn_type => %Q(:tick),

      # Needs :ecatb_turn to be :tick to be used
      # Sets the turn length in seconds
      # Its corresponding method's created under Scene_Battle
      # It must return a positive real number
      # Example: To set the turn length as the base atb fill time, set this as
      #          %Q(BattleManager.ecatb_base_fill_t)
      :ecatb_tick_count => %Q(10),

      # Needs :ecatb_turn to be :act to be used
      # Sets the turn length in the number of actions counted
      # Its corresponding method's created under Scene_Battle
      # It must return a positive real number and should return a natural number
      # Example: To set the turn length as x actions, set this as %Q(x)
      :ecatb_after_act => %Q(10),

      # Needs :ecatb_turn to be :battler to be used
      # Sets the number of units per battler counted added to the turn length
      # The unit can either be :tick or :act
      # :tick means the unit is second
      # :act means the unit is the number of actions
      # Its corresponding method's created under Scene_Battle
      # It must return an array
      # Its 1st element must return a positive real number and should return a
      # natural number
      # Its 2nd element must return either :tick or :act
      # Example: To set the battler scale as x actions, set this as
      #          %Q([x, :act])
      :ecatb_battler_scale => %Q([1, :tick]),

      # Needs :ecatb_turn to be :battler to be used
      # Sets the battlers to be counted in the battler scale
      # Its corresponding method's created under Scene_Battle
      # It must return a positive real number and should return the size of
      # an array of battlers
      # Example: To include all battlers, set this as
      #          Q($game_party.members.size + $game_troop.members.size)
      :ecatb_battler_count => %Q($game_party.alive_members.size + 
                                 $game_troop.alive_members.size),

      # Needs :ecatb_turn to be :act or :battler to be used
      # Sets if force actions are counted as well
      # Its corresponding method's created under Scene_Battle
      # Example: To count the force actions as well if switch with id x is on,
      #          set this as %Q($game_switches[x])
      :ecatb_force_act_count => %Q(false),

      # (v0.04a+)Sets if battles will behave like a CTB by skipping the atb,
      # charge and cooldown filling times, and the global atb tick clock
      # Its corresponding method's created under BattleManager
      # Example: To replicate a CTB system if switch with id x is on, set this
      #          as %Q($game_switches[x])
      :ecatb_ctb => %Q(false),

      # Sets the priority of the ecatb rate notetags to be used
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # It must return an array with elements being either :states, :enemies,
      # :armors, :weapons, :classes or :actors
      # Example: To set actors to have a higher priority than that of states,
      #          set this as %Q([:actors, :states])
      :ecatb_rate_ord => %Q([:actors, :classes, :weapons, :armors, :enemies, 
                             :states]),

      # Sets the 1st atb value of actors when battles start normally
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # It must return a non-negative real number and should return a
      # non-negative floating-point number
      # Example: To set the 1st atb value of actors when battler start normally
      #          as x%, set this as %Q(@ecatb_val[:atb] = x)
      :normal_actor_1st_ecatb_val => %Q(@ecatb_val[:atb] = 0.0),

      # Sets the 1st atb value of enemies when battles start normally
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # It must return a non-negative real number and should return a
      # non-negative floating-point number
      # Example: To set the 1st atb value of enemies when battler start normally
      #          as x%, set this as %Q(@ecatb_val[:atb] = x)
      :normal_enemy_1st_ecatb_val => %Q(@ecatb_val[:atb] = 0.0),

      # Sets the 1st atb value of actors when battles start with preemptive
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # It must return a non-negative real number and should return a
      # non-negative floating-point number
      # Example: To set the 1st atb value of actors when battler start with
      #          preemptive as x%, set this as %Q(@ecatb_val[:atb] = x)
      :preemptive_actor_1st_ecatb_val => %Q(@ecatb_val[:atb] = 100.0),

      # Sets the 1st atb value of enemies when battles start with preemptive
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # It must return a non-negative real number and should return a
      # non-negative floating-point number
      # Example: To set the 1st atb value of enemies when battler start with
      #          preemptive as x%, set this as %Q(@ecatb_val[:atb] = x)
      :preemptive_enemy_1st_ecatb_val => %Q(@ecatb_val[:atb] = 0.0),

      # Sets the 1st atb value of actors when battles start with surprise
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # It must return a non-negative real number and should return a
      # non-negative floating-point number
      # Example: To set the 1st atb value of actors when battler start with
      #          surprise as x%, set this as %Q(@ecatb_val[:atb] = x)
      :surprise_actor_1st_ecatb_val => %Q(@ecatb_val[:atb] = 0.0),

      # Sets the 1st atb value of enemies when battles start with surprise
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # It must return a non-negative real number and should return a
      # non-negative floating-point number
      # Example: To set the 1st atb value of enemies when battler start with
      #          surprise as x%, set this as %Q(@ecatb_val[:atb] = x)
      :surprise_enemy_1st_ecatb_val => %Q(@ecatb_val[:atb] = 100.0),

      # Sets the priority of the ecatb start value notetags to be used
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # It must return an array with elements being either :states, :enemies,
      # :armors, :weapons, :classes or :actors
      # Example: To set actors to have a higher priority than that of states,
      #          set this as %Q([:actors, :states])
      :ecatb_start_val_ord => %Q([:actors, :classes, :weapons, :armors, 
                                  :enemies, :states]),

      # Sets the battler methods included to calculate the sum of each of those
      # methods of battlers in :ecatb_def_sum_battlers
      # Its corresponding method's created under BattleManager
      # It must return an array of symbols being defined battler methods
      # Example: To calculate the sum of luk of all battlers in 
      #          :ecatb_def_sum_battlers, set this as %Q([:luk])
      :ecatb_battlers_def_sum => %Q([:agi]),

      # Sets the battlers to be included to calculate each of their method sums
      # Its corresponding method's created under BattleManager
      # It must return an array of battlers
      # Example: To set all battlers to be included to calculate each of their
      #          method sums, set this as
      #          %Q($game_party.battle_members + $game_troop.members)
      :ecatb_def_sum_battlers => %Q($game_party.alive_members + 
                                    $game_troop.alive_members),

      # Sets if the sum of each battler method in :ecatb_battlers_def_sum of all
      # battlers in :ecatb_def_sum_battlers will be updated
      # Its corresponding method's created under BattleManager
      # Example: To update the sum of each battler method in
      #          :ecatb_battlers_def_sum of all battlers in
      #          :ecatb_def_sum_battlers if switch with id x is on, set this as
      #          %Q($game_switches[x])
      :update_ecatb_battlers_def_sums => %Q(ecatb_def_sum_battlers.any?(
                                            &DoubleX_RMVXA::ECATB::BLOCKS[
                                            :ecatb_refresh])),

      # Sets the action points reduced for all party members upon failed escapes
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # It must return a real number and should return an integer
      # Example: To set the escape action cost as x, set this as %Q(x)
      :ecatb_esc_act_cost => %Q(1),

      # Sets the atb reset value upon each failed escape
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # It must return a real number and should return a floating-point number
      # Example: To add the atb reset value upon a failed escape by x%, set this
      #          as %Q(@ecatb_reset_val + x)
      :ecatb_esc_reset_val => %Q(0.0),

      # It won't be used if :actor_sprite_ecatb_bar returns true
      # Sets the text to be displayed on actor atb bars showing its details
      # The atb bar fill rate and action points can be referneced by percent and
      # action respectively
      # Its corresponding method's created under Window_BattleStatus
      # It must return a string
      # Example: To set the text to be displayed on actor atb bars showing the
      #          actors' action points, set this as %Q(act)
      :actor_ecatb_bar_text => %Q(percent + "% " + act),

      # It won't be used if :actor_sprite_ecatb_bar returns true
      # Sets the word describing and displayed on actor atb bars
      # Its corresponding method's created under Window_BattleStatus
      # It must return a string
      # Example: To use the word "ATB" to describe and be displayed on actor atb
      #          bars, set this as %Q("ATB")
      :actor_ecatb_bar_word => %Q("AP"),

      # It won't be used if :actor_sprite_ecatb_bar returns true
      # Sets the actor atb bar y offset
      # Its corresponding method's created under Window_BattleStatus
      # It must return a real number and should return an integer
      # Example: To set the actor atb bar y offset as x, set this as %Q(x)
      :actor_ecatb_bar_y_add => %Q(12),

      # Sets the atb bar colors
      # It'll be used only if no corresponding color notetags are used
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # It must return an array of colors
      # Example: To set the atb bar colors as text color c and r, g, b, a rgba
      #          values, set this as
      #          %Q([Colour.text_colour(c), Color.new(r, g, b, a)])
      :ecatb_bar_colors => %Q([Colour.text_colour(7), Colour.text_colour(8)]),

      # Sets the priority of the ecatb bar color notetags to be used
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # It must return an array with elements being either :states, :enemies,
      # :armors, :weapons, :classes or :actors
      # Example: To set states to have a higher priority than that of actors,
      #          set this as %Q([:states, :actors])
      :ecatb_bar_color_ord => %Q([:states, :enemies, :armors, :weapons,
                                  :classes, :actors]),

      # (v0.03a+)Sets something to happen right before inputting actions by a
      # battler
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # Example: To call a common event with id x right before inputting actions
      #          by a battler, set this as
      #          %Q($game_temp.reserve_common_event(x))
      :pre_ecatb_input_act => %Q(),

      # (v0.03a+)Sets something to happen right after inputting actions by a
      # battler
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # Example: To call a common event with id x right after inputting actions
      #          by a battler, set this as
      #          %Q($game_temp.reserve_common_event(x))
      :post_ecatb_input_act => %Q(),

      # (v0.03a+)Sets something to happen right before resetting a battler's
      # atb
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # Example: To call a common event with id x right before resetting a
      #          battler's atb, set this as
      #          %Q($game_temp.reserve_common_event(x))
      :pre_ecatb_reset => %Q(),

      # (v0.03a+)Sets something to happen right after resetting a battler's
      # atb
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # Example: To call a common event with id x right after resetting a
      #          battler's atb, set this as
      #          %Q($game_temp.reserve_common_event(x))
      :post_ecatb_reset => %Q(),

      # Sets something to happen right before updating the atb clock
      # Its corresponding method's created under Scene_Battle
      # Example: To support changing atb, charge and cooldown bar colors of all
      #          battlers per frame, set this as
      #          %Q(all_battle_members.each { |mem|
      #               mem.ecatb_note_change[:atb] = 
      #               mem.ecatb_note_change[:charge] = 
      #               mem.ecatb_note_change[:cooldown] = true
      #             })
      :pre_ecatb_update => %Q(),

      # Sets something to happen right after updating the atb clock
      # Its corresponding method's created under Scene_Battle
      # Example: To call a common event with id x right after updating the atb
      #          clock, set this as %Q($game_temp.reserve_common_event(x))
      :post_ecatb_update => %Q()

    }

  #----------------------------------------------------------------------------|
  #  * (v0.05a+)Action                                                         |
  #    Setups configurations of the action features                            |
  #----------------------------------------------------------------------------|

    #--------------------------------------------------------------------------|
    #  Gradual Action Gain Notetag Values                                      |
    #  - Setups gagx used by <ecatb gradual action gain: gagx> notetags        |
    #--------------------------------------------------------------------------|
    # gagx are read at:
    # 1. RPG::Actor, RPG::Class, RPG::EquipItem, RPG::Enemy, RPG::State
    #    - next @ecatb_notes[:act] = $1.downcase.to_sym in load_ecatb_notes
    # gagx are used at:
    # 1. Game_BattlerBase
    #    - @ecatb_notes[note] = ecatb.send(n, self) in set_ecatb_notes
    # gagx are strings of names of methods under DoubleX_RMVXA::ECATB
    # gagx names can only use alphanumeric characters and can't use uppercase
    # letters
    # battler is the battler calling the gagx
    # The below gagx are examples added to help you set your gagx
    # You can freely use, rewrite and/or delete these examples

    # Sets gradual action gain as true
    def self.gag1(battler)
      true
    end

    # Sets gradual action gain as false
    def self.gag2(battler)
      false
    end

    # Sets gradual action gain as the state of switch with id x
    def self.gag3(battler)
      $game_switches[x]
    end

    # Adds new gagx here
    

    #--------------------------------------------------------------------------|
    #  Action Configurations                                                   |
    #  - Setups configurations of the action features                          |
    #  - The value of each configuration is the string of the content of its   |
    #    corresponding method                                                  |
    #--------------------------------------------------------------------------|

    ACTION = {

      # Sets whether a battler gains action points gradually instead of gaining
      # its maximum instantly
      # It'll be used only if no corresponding color notetags are used
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # Example: To set a battler to gain the maximum action points instantly if
      #          switch with id x is on, set this as %Q($game_switches[x])
      :gradual_ecatb_action_gain => %Q(true),

      # Sets the priority of the ecatb gradual action gain notetags to be used
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # It must return an array with elements being either :states, :enemies,
      # :armors, :weapons, :classes or :actors
      # Example: To set states to have a higher priority than that of actors,
      #          set this as %Q([:states, :actors])
      :gradual_ecatb_action_gain_ord => %Q([:states, :enemies, :armors, 
                                            :weapons, :classes, :actors])

    }

  #----------------------------------------------------------------------------|
  #  * Bar                                                                     |
  #    Setups configurations and default notetag values of the bar features    |
  #----------------------------------------------------------------------------|

    #--------------------------------------------------------------------------|
    #  Bar Configurations                                                      |
    #  - Setups configurations and default notetag values of the bar features  |
    #  - The value of each configuration is the string of the content of its   |
    #    corresponding method                                                  |
    #--------------------------------------------------------------------------|

    # Sets if only enemies being dead before are shown with the atb bar
    # It'll only be used if it's not set by
    # <enemy ecatb bar show: kill, bar, percent, act> notetags
    # It must be either true or false
    # Example: To sets only enemies being dead before to be shown with the atb
    # bar, set this as %Q(true)
    BAR_KILL_ENEMY_1ST = %Q(false)

    # Sets if enemy atb bars are shown
    # It'll only be used if it's not set by
    # <enemy ecatb bar show: kill, bar, percent, act> notetags
    # It must be either true or false
    # Example: To hide enemy atb bars, set this as %Q(false)
    ENEMY_BAR_SHOW = %Q(true)

    # Sets if enemy action point is shown on enemy atb bars
    # It'll only be used if it's not set by
    # <enemy ecatb bar show: kill, bar, percent, act> notetags
    # It must be either true or false
    # Example: To hide the enemy action points from the enemy atb bar, set this
    # as %Q(false)
    ENEMY_BAR_SHOW_ACT = %Q(true)

    # Sets if atb fill percent is shown on enemy atb bars
    # It'll only be used if it's not set by
    # <enemy ecatb bar show: kill, bar, percent, act> notetags
    # It must be either true or false
    # Example: To hide the enemy atb fill percent from the enemy atb bar, set
    # this as %Q(false)
    ENEMY_BAR_SHOW_PERCENT = %Q(true)

    BAR = {

      # Sets if the actor atb bars are displayed on their sprites instead
      # Its corresponding method's created under BattleManager
      # It must always return the same result during the same battle
      # Example: To display the actor atb bars on their sprites as well if
      #          switch with id x is on, set this as %Q($game_switches[x])
      :actor_sprite_ecatb_bar => %Q(false),

      # (v0.04d+)Sets if the atb and charge/cooldown bars are displayed
      # simultaneously
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # It must return the same value during the same battle
      # Example: To stop displaying atb and charge/cooldown bars simultaneously,
      #          set this as %Q(false)
      :ecatb_bar_multilayer => %Q(true),

      # Sets if battler sprite atb bars are animated
      # Its corresponding method's created under ECATB_Bar
      # Example: To animate the battler sprite atb bars if switch with id x is
      #          on, set this as %Q($game_switches[x])
      :ecatb_bar_ani => %Q(true),

      # Sets the battler sprite atb bar to animate horizontally per frame
      # Its corresponding method's created under ECATB_Bar
      # It must return a real number and should return an integer
      # Example: To set the battler sprite atb bar to animate horizontally by
      #          number of pixels being the value of variable with id x per
      #          frame, set this as %Q($game_variables[x])
      :ecatb_bar_ani_ox => %Q(2),

      # Sets the battler sprite atb bar width and height
      # Its corresponding method's created under ECATB_Bar
      # It must return an array of positive real numbers and should return an
      # array of natural numbers
      # Example: To set the battler sprite atb bar width and height to be the
      #          values of variables with id x and y respectively, set this as
      #          %Q([$game_variables[x], $game_variables[y]])
      :ecatb_bar_wh => %Q([48, 12]),

      # Sets the battler sprite atb bar xy offsets from the host battler sprite
      # Its corresponding method's created under ECATB_Bar
      # It must return an array of real numbers and should return an array of
      # integers
      # Example: To set the battler sprite atb bar x and y offsets as the value
      #          of variables with id a and b respectively, set this as
      #          %Q([$game_variables[a], $game_variables[b]])
      :ecatb_bar_xy_offset => %Q([0, 0]),

      # Sets the battler sprite atb bar z position
      # Its corresponding method's created under ECATB_Bar
      # It must return a non-negative real number and should return a
      # non-negative integer
      # Example: To set the battler sprite atb bar z position as the value of
      #          variable with id x, set this as %Q($game_variables[x])
      :ecatb_bar_z => %Q(0),

      # Sets the text to be displayed on battler sprite atb bars showing its
      # details
      # The atb bar fill rate and action points can be referneced by percent and
      # action respectively
      # Its corresponding method's created under ECATB_Bar
      # It must return a string
      # Example: To set the text to be displayed on battler sprite atb bars
      #          showing the battlers' action points, set this as %Q(act)
      :ecatb_bar_text => %Q(percent + "% " + act),

      # Sets the battler sprite atb bar text color
      # Its corresponding method's created under ECATB_Bar
      # It must return a color
      # Example: To set the battler sprite atb bar text color as r, g, b, a rgba
      #          values, set this as %Q(Color.new(r, g ,b ,a))
      :ecatb_bar_text_color => %Q(Colour.text_colour(0)),

      # Sets the battler sprite atb bar text size
      # Its corresponding method's created under ECATB_Bar
      # It must return a positive real number and should return an integer
      # Example: To set the battler sprite atb bar text saize as the value of
      #          variable with id x, set this as %Q($game_variables[x])
      :ecatb_bar_text_size => %Q(16),

      # Sets the battler sprite atb bar text x and y offsets from the atb bars
      # Its corresponding method's created under ECATB_Bar
      # It must return an array of real numbers and should return an array of
      # integers
      # Example: To set the battler sprite atb bar text x and y offsets from the
      #          atb bars as the values of variables with id a and b
      #          respectively, set this as
      #          %Q([$game_variables[a], $game_variables[b]])
      :ecatb_bar_text_xy_offset => %Q([-1, -1]),

      # Sets the battler sprite atb bar back colors
      # Its corresponding method's created under ECATB_Bar
      # It must return an array of colors
      # Example: To set the battler sprite atb back bar colors as text color c
      #          and r, g, b, a rgba values, set this as
      #          %Q([Colour.text_colour(c), Color.new(r, g, b, a)])
      :ecatb_bar_back_colors => %Q([Colour.text_colour(15), 
                                    Colour.text_colour(15)])

    }

  #----------------------------------------------------------------------------|
  #  * Cancel                                                                  |
  #    Setups configurations of the cancel features                            |
  #----------------------------------------------------------------------------|

    #--------------------------------------------------------------------------|
    #  Cancel Configurations                                                   |
    #  - Setups configurations of the cancel features                          |
    #  - The value of each configuration is the string of the content of its   |
    #    corresponding method                                                  |
    #--------------------------------------------------------------------------|

    CANCEL = {

      # Sets the key opening the cancel window
      # Its corresponding method's created under Scene_Battle
      # It must return a symbol and should return an Input constant
      # Example: To set the cancel window opening key as X, set this as %Q(:X)
      :ecatb_cancel_key => %Q(:SHIFT),

      # Sets the description text of the cancel window
      # Its corresponding method's created under Scene_Battle
      # It must return a string
      # Example: To set the description text of the cancel window as
      #          "Actor name", set this as
      #          %Q($game_party.members[@ecatb_cancel_window.index].name)

      :ecatb_cancel_text => %Q("Select an actor without autobattle nor " +
                               "confusion to\ncancel his/her/its partially " +
                               "charging skill/item.")

    }

  #----------------------------------------------------------------------------|
  #  * Charge                                                                  |
  #    Setups configurations and notetag values of the charge features         |
  #----------------------------------------------------------------------------|

    #--------------------------------------------------------------------------|
    #  Charge Prior Action Cost Notetag Values                                 |
    #  - Setups cpacx used by <ecatb charge prior act cost: cpacx> notetags    |
    #--------------------------------------------------------------------------|
    # cpacx are read at:
    # 1. RPG::UsableItem
    #    - send(:"#{note}=", send(:"#{note}") || val) in load_ecatb_notes
    # cpacx are used at:
    # 1. Game_Battler
    #    - unless ecatb.send(@last_ecatb_item.ecatb_charge_prior_act_cost, self)
    #      in pay_prior_ecatb_charge
    #    - if ecatb.send(item.ecatb_charge_prior_act_cost, self) in
    #      exec_ecatb_act_cost
    #    - !ecatb.send(item.ecatb_charge_prior_act_cost, self) in
    #      ecatb_unison_actor?
    # cpacx shouldn't return random values
    # cpacx are strings of names of methods under DoubleX_RMVXA::ECATB
    # cpacx names can only use alphanumeric characters and can't use uppercase
    # letters
    # battler is the battler calling the cpacx
    # The below cpacx are examples to help you set your cpacx
    # You can freely use, rewrite and/or delete these examples

    # Sets charge prior action cost as true
    def self.cpac1(battler)
      true
    end

    # Sets charge prior action cost as false
    def self.cpac2(battler)
      false
    end

    # Sets charge prior action cost as the state of switch with id x
    def self.cpac3(battler)
      $game_switches[x]
    end

    # Adds new cpacx here
    

    # Sets if action cost is paid after finished charging
    # It'll be used only if no cpacx are used
    # battler is the battler calling the ecatb_charge_prior_act_cost
    # Example: To set the default action costs to be paid after charging if
    #          switch with id x is on, set this as %Q($game_switches[x])
    def self.ecatb_charge_prior_act_cost(battler)
      true
    end

    #--------------------------------------------------------------------------|
    #  Charge Prior Item Cost Notetag Values                                   |
    #  - Setups cpicx used by <ecatb charge prior item cost: cpicx> notetags   |
    #--------------------------------------------------------------------------|
    # cpicx are read at:
    # 1. RPG::UsableItem
    #    - send(:"#{note}=", send(:"#{note}") || val) in load_ecatb_notes
    # cpicx are used at:
    # 1. Game_Battler
    #    - !DoubleX_RMVXA::ECATB.send(skill.ecatb_charge_prior_item_cost, self)
    #      in skill_cost_payable?
    #    - unless DoubleX_RMVXA::ECATB.send(item.ecatb_charge_prior_item_cost,
    #      self)in use_item
    #    - return if ecatb.send(@last_ecatb_item.ecatb_charge_prior_item_cost,
    #      self) in pay_prior_ecatb_charge
    # cpicx shouldn't return random values
    # cpicx are strings of names of methods under DoubleX_RMVXA::ECATB
    # cpicx names can only use alphanumeric characters and can't use uppercase
    # letters
    # battler is the battler calling the cpicx
    # The below cpicx are examples to help you set your cpicx
    # You can freely use, rewrite and/or delete these examples

    # Sets charge prior item cost as true
    def self.cpic1(battler)
      true
    end

    # Sets charge prior item cost as false
    def self.cpic2(battler)
      false
    end

    # Sets charge prior item cost as the state of switch with id x
    def self.cpic3(battler)
      $game_switches[x]
    end

    # Adds new cpicx here
    

    # Sets if item costs are paid after finished charging
    # It'll be used only if no cpicx are used
    # battler is the battler calling ecatb_charge_prior_item_cost
    # Example: To set the default item costs to be paid after charging if switch
    #          with id x is on, set this as %Q($game_switches[x])
    def self.ecatb_charge_prior_item_cost(battler)
      true
    end

    #--------------------------------------------------------------------------|
    #  Charge Rate Notetag Values                                              |
    #  - Setups crx used by <ecatb charge rate: crx> notetags                  |
    #--------------------------------------------------------------------------|
    # crx are read at:
    # 1. RPG::UsableItem
    #    - send(:"#{note}=", send(:"#{note}") || val) in load_ecatb_notes
    # crx are used at:
    # 1. Game_BattlerBase
    #    - DoubleX_RMVXA::ECATB.send(@last_ecatb_item.ecatb_charge_rate, self, 
    #      @last_ecatb_rate[:charge]) in ecatb_charge_gain_rate
    # crx are strings of names of methods under DoubleX_RMVXA::ECATB
    # crx must return a real number and should return a floating-point number
    # crx names can only use alphanumeric characters and can't use uppercase
    # letters
    # battler is the battler calling the crx
    # rate is the atb gain rate of battler
    # The below crx are examples to help you set your crx
    # You can freely use, rewrite and/or delete these examples

    # Sets the charge rate as x% per frame
    def self.cr1(battler, rate)
      x
    end

    # Sets the charge rate as the value of variable with id x * 100% per frame
    def self.cr2(battler, rate)
      $game_variables[x]
    end

    # Sets the charge rate as x times the atb gain rate
    def self.cr3(battler, rate)
      rate * x
    end

    # Adds new crx here
    

    # Sets the default charge rate
    # It'll be used only if no crx are used
    # battler is the battler calling ecatb_charge_rate
    # rate is the atb gain rate of battler
    # Example: To disable charging, set this as %Q(100.0)
    def self.ecatb_charge_rate(battler, rate)
      100.0
    end

    #--------------------------------------------------------------------------|
    #  Charge Configurations                                                   |
    #  - Setups configurations of the charge features                          |
    #  - The value of each configuration is the string of the content of its   |
    #    corresponding method                                                  |
    #--------------------------------------------------------------------------|

    CHARGE = {

      # Sets the charge bar colors
      # It'll be used only if no corresponding color notetags are used
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # It must return an array of colors
      # Example: To set the charge bar colors as text color c and r, g, b, a
      #          rgba values, set this as
      #          %Q([Colour.text_colour(c), Color.new(r, g, b, a)])
      :ecatb_charge_bar_colors => %Q([Colour.text_colour(30), 
                                      Colour.text_colour(31)]),

      # Sets the priority of the ecatb charge bar color notetags to be used
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # It must return an array with elements being either :states, :enemies,
      # :armors, :weapons, :classes or :actors
      # Example: To set states to have a higher priority than that of actors,
      #          set this as %Q([:states, :actors])
      :ecatb_charge_bar_color_ord => %Q([:states, :enemies, :armors, :weapons, 
                                         :classes, :actors]),

      # Sets the party escape charge rate
      # The atb rate can be referneced by charge
      # Its corresponding method's created under Game_Actor
      # It must return a real number and should return a floating-point number
      # Example: To disable party escape charging, set this as %Q(100.0)
      :esc_ecatb_charge_rate => %Q(100.0)

    }

  #----------------------------------------------------------------------------|
  #  * Clock                                                                   |
  #    Setups configurations of the clock features                             |
  #----------------------------------------------------------------------------|

    #--------------------------------------------------------------------------|
    #  Clock Configurations                                                    |
    #--------------------------------------------------------------------------|

    CLOCK = {

      # Shows the atb clock window
      # It's used under Scene_Battle but it doesn't have any associated method
      # Example: To show the atb clock window if switch with id x is on, set
      #          this as %Q($game_switches[x])
      :show_ecatb_clock_window => %Q(true),

      # Sets the atb clock window width and height
      # Its corresponding method's created under ECATB_Clock_Window
      # It must return an array of positive real numbers and should return an
      # array of natural numbers
      # Example: To set the atb clock window width and height as the value of
      #          variables with id x and y respectively, set this as
      #          %Q([$game_variables[x], $game_variables[y]])
      :ecatb_clock_window_wh => %Q([128, 48]),

      # Sets the atb clock window x, y and z positions
      # Its corresponding method's created under ECATB_Clock_Window
      # It must return an array of real numbers and should return an array of
      # integers
      # Example: To set the atb clock window x, y and z positions as the value
      #          of variables with id a, b and c respectively, set this as
      #         %Q([$game_variables[a], $game_variables[b], $game_variables[c]])
      :ecatb_clock_window_xyz => %Q([0, 0, 0]),

      # Sets the turn portion bar colors
      # Its corresponding method's created under ECATB_Clock_Bar
      # It must return an array of colors
      # Example: To set the turn portion bar colors as text color c and r, g, b,
      #          a rgba values, set this as
      #          %Q([Colour.text_colour(c), Color.new(r, g, b, a)])
      :ecatb_clock_bar_colors => %Q([Colour.text_colour(7), 
                                     Colour.text_colour(8)]),

      # Sets the turn portion bar width and height
      # Its corresponding method's created under ECATB_Clock_Bar
      # It must return an array of positive real numbers and should return an
      # array of natural numbers
      # Example: To set the turn portion bar width and height as the value of
      #          variables with id x and y respectively, set this as
      #          %Q([$game_variables[x], $game_variables[y]])
      :ecatb_clock_bar_wh => %Q([104, 12]),

      # Sets the turn portion bar x and y positions
      # Its corresponding method's created under ECATB_Clock_Bar
      # It must return an array of real numbers and should return an array of
      # integers
      # Example: To set the turn portion bar x and y positions as the value of
      #          variables with id x and y respectively, set this as
      #          %Q([$game_variables[x], $game_variables[y]])
      :ecatb_clock_bar_xy => %Q([8, 8]),

      # Sets the way the turn portion and count text are shown
      # The current atb clcok can be referneced by cur_clock
      # The maximum atb clock can be referneced by max_clock
      # The turn count can be referenced by turn_count
      # Its corresponding method's created under ECATB_Clock_Window
      # It must return a string
      # Example: To set the way the turn portion and count text are shown as
      #          "cur_clock/max_clock", set this as
      #          %Q(cur_clock.to_s + "/" + max_clock.to_s)
      :ecatb_clock_text => %Q(cur_clock.to_s + "/" + max_clock.to_s + " " + 
                              turn_count.to_s),

      # Sets the turn portion and count text color
      # Its corresponding method's created under ECATB_Clock_Window
      # It must return a color
      # Example: To set the turn portion and count text color's rgba values as
      #          r, g, b and a, set this as %Q(Color.new(r, g, b, a))
      :ecatb_clock_text_color => %Q(Colour.text_colour(0)),

      # Sets the turn portion and count text size
      # Its corresponding method's created under ECATB_Clock_Window
      # It must return a positive real number and should return a natural number
      # Example: To set the turn portion and count text size as the value of
      #          variable with id x, set this as %Q($game_variables[x])
      :ecatb_clock_text_size => %Q(16),

      # Sets the turn portion and count text x and y positions
      # Its corresponding method's created under ECATB_Clock_Window
      # It must return an array of real numbers and should return an array of
      # integers
      # Example: To set the turn portion and count text x and y positions as the
      #          value of variables with id a and b respectively, set this as
      #          %Q([$game_variables[a], $game_variables[b]])
      :ecatb_clock_text_xy => %Q([0, 4])

    }

  #----------------------------------------------------------------------------|
  #  * Cooldown                                                                |
  #    Setups configurations and notetag values of the cooldown features       |
  #----------------------------------------------------------------------------|

    #--------------------------------------------------------------------------|
    #  Cooldown Rate Notetag Values                                            |
    #  - Setups cdrx used by <ecatb cooldown rate: cdrx> notetags              |
    #--------------------------------------------------------------------------|
    # cdrx are read at:
    # 1. RPG::UsableItem
    #    - send(:"#{note}=", send(:"#{note}") || val) in load_ecatb_notes
    # cdrx are used at:
    # 1. Game_BattlerBase
    #    - DoubleX_RMVXA::ECATB.send(@last_ecatb_item.ecatb_cooldown_rate, self,
    #      @last_ecatb_rate[:cooldown]) in ecatb_cooldown_loss_rate
    # The atb rate can be referenced by val
    # cdrx are strings of names of methods under DoubleX_RMVXA::ECATB
    # cdrx must return a real number and should return a floating-point number
    # cdrx names can only use alphanumeric characters and can't use uppercase
    # letters
    # battler is the battler calling the cdrx
    # rate is the atb gain rate of battler
    # The below cdrx are examples to help you set your cdrx
    # You can freely use, rewrite and/or delete these examples

    # Sets the cooldown rate as x% per frame
    def self.cdr1(battler, rate)
      x
    end

    # Sets the cooldown rate as the value of variable with id x* 100% per frame
    def self.cdr2(battler, rate)
      $game_variables[x]
    end

    # Sets the cooldown rate as x times the atb gain rate
    def self.cdr3(battler, rate)
      rate * x
    end

    # Adds new cdrx here
    

    # Sets the default cooldown rate
    # It'll be used only if no cdrx are used
    # battler is the battler calling ecatb_cooldown_rate
    # rate is the atb gain rate of battler
    # Example: To disable cooldown, set this as %Q(100.0)
    def self.ecatb_cooldown_rate(battler, rate)
      100.0
    end

    #--------------------------------------------------------------------------|
    #  Cooldown Configurations                                                 |
    #  - Setups configurations of the cooldown features                        |
    #  - The value of each configuration is the string of the content of its   |
    #    corresponding method                                                  |
    #--------------------------------------------------------------------------|

    COOLDOWN = {

      # Sets the cooldown bar colors
      # It'll be used only if no corresponding color notetags are used
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # It must return an array of colors
      # Example: To set the cooldown bar colors as text color c and r, g, b, a
      #          rgba values, set this as
      #          %Q([Colour.text_colour(c), Color.new(r, g, b, a)])
      :ecatb_cooldown_bar_colors => %Q([Colour.text_colour(19), 
                                        Colour.text_colour(26)]),

      # Sets the priority of the ecatb cooldown bar color notetags to be used
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # It must return an array with elements being either :states, :enemies,
      # :armors, :weapons, :classes or :actors
      # Example: To set states to have a higher priority than that of actors,
      #          set this as %Q([:states, :actors])
      :ecatb_cooldown_bar_color_ord => %Q([:states, :enemies, :armors, 
                                           :weapons, :classes, :actors]),

      # (v0.03a+)Sets something to happen right after finishing cooling down
      # normally
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # Example: To call a common event with id x right after finishing cooling
      #          down normally, set this as
      #          %Q($game_temp.reserve_common_event(x))
      :ecatb_cooldown_finish => %Q(),

      # Sets the failed party escape cooldown rate
      # The atb rate can be referneced by cooldown
      # Its corresponding method's created under Game_Actor
      # It must return a real number and should return a floating-point number
      # Example: To disable failed party escape cooldown, set this as %Q(100.0)
      :esc_ecatb_cooldown_rate => %Q(100.0)

    }

  #----------------------------------------------------------------------------|
  #  * Countdown                                                               |
  #    Setups configurations and notetag values of the countdown features      |
  #----------------------------------------------------------------------------|

    #--------------------------------------------------------------------------|
    #  Countdown Interval Notetag Values                                       |
    #  - Setups cix used by <ecatb countdown interval: cix> notetags           |
    #--------------------------------------------------------------------------|
    # cix are read at:
    # 1. RPG::State
    #    - next @ecatb_countdown_interval = $1.downcase.to_sym in
    #      load_ecatb_notes
    # cix are used at:
    # 1. Game_Battler
    #    - return unless $data_states[state_id].ecatb_countdown_interval in
    #      reset_state_counts
    #    - @ecatb_countdown_clock.each_key(&@ecatb_countdown_updates) in
    #      ecatb_countdown_update
    # cix are strings of names of methods under DoubleX_RMVXA::ECATB
    # cix must return a positive real number and should return a natural number
    # cix names can only use alphanumeric characters and can't use uppercase
    # letters
    # battler is the battler calling the cix
    # The below cix are examples to help you set your cix
    # You can freely use, rewrite and/or delete these examples

    # Sets the countdown interval as x seconds
    def self.ci1(battler)
      x
    end

    # Sets the countdown interval as the number of seconds equal to the value of
    # variable with id x
    def self.ci2(battler)
      $game_variables[x]
    end

    # Adds new cix here
    

    #--------------------------------------------------------------------------|
    #  (v0.05a+)Countdown Configurations                                       |
    #  - Setups configurations of the countdown features                       |
    #  - The value of each configuration is the string of the content of its   |
    #    corresponding method                                                  |
    #--------------------------------------------------------------------------|

    COUNTDOWN = {

      # Sets the minimum countdown interval for all states in frames
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # It must return a natural number
      # Example: To minimum countdown interval for all states in frames as the
      #          half of the number of frames per second, set this as
      #          %Q(Graphics.frame_rate / 2)
      :ecatb_countdown_min => %Q(Graphics.frame_rate)

    }

  #----------------------------------------------------------------------------|
  #  * Force                                                                   |
  #    Setups configurations of the force features                             |
  #----------------------------------------------------------------------------|

    #--------------------------------------------------------------------------|
    #  Force Configurations                                                    |
    #  - Setups configurations of the force features                           |
    #  - The value of each configuration is the string of the content of its   |
    #    corresponding method                                                  |
    #--------------------------------------------------------------------------|

    FORCE = {

      # Sets the key forcing the atb clock to run
      # Its corresponding method's created under Scene_Battle
      # It must return a symbol and should return an Input constant
      # If :ecatb_force_stop_key is pressed before pressing
      # :ecatb_force_run_key, the latter will cancel the former instead of
      # forcing the atb clock to run
      # Pressing :ecatb_force_run_key again will force the atb clock to run
      # Example: To disable this feature, set this as %Q(:unused), where :unused
      #          is an unused keymap
      :ecatb_force_run_key => %Q(:CTRL),

      # Sets the key forcing the atb clock to stop
      # Its corresponding method's created under Scene_Battle
      # It must return a symbol and should return an Input constant
      # If :ecatb_force_run_key is pressed before pressing
      # :ecatb_force_stop_key, the latter will cancel the former instead of
      # forcing the atb clock to stop
      # Example: To disable this feature, set this as %Q(:unused), where :unused
      #          is an unused keymap
      :ecatb_force_stop_key => %Q(:ALT),

      # Shows the atb force window displaying the atb force status
      # It's used under Scene_Battle but it doesn't have any associated method
      # Example: To show the atb force window if switch with id x is on, set
      #          this as %Q($game_switches[x])
      :show_ecatb_force_window => %Q(true),

      # Sets the atb force window width and height
      # Its corresponding method's created under ECATB_Force_Window
      # It must return an array of positive real numbers and should return an
      # array of natural numbers
      # Example: To set the atb force window width and height as the value of
      #          variables with id x and y respectively, set this as
      #          %Q([$game_variables[x], $game_variables[y]])
      :ecatb_force_window_wh => %Q([128, 40]),

      # Sets the atb force widnow x, y and z positions
      # Its corresponding method's created under ECATB_Force_Window
      # It must return an array of real numbers and should return an array of
      # integers
      # Example: To set the atb force window x, y and z positions as the value
      #          of variables with id a, b and c respectively, set this as
      #         %Q([$game_variables[a], $game_variables[b], $game_variables[c]])
      :ecatb_force_window_xyz => %Q([0, 48, 0]),

      # Sets the atb force window text to be displayed when the atb clock isn't
      # forced
      # Its corresponding method's created under ECATB_Force_Window
      # It must return a string
      # Example: To set the atb force window text to be displayed when the atb
      #          clock isn't forced as "nil", set this as %Q("nil")
      :ecatb_force_nil_text => %Q("No Force ATB"),

      # Sets the atb force window text to be displayed when the atb clock's
      # forced to run
      # Its corresponding method's created under ECATB_Force_Window
      # It must return a string
      # Example: To set the atb force window text to be displayed when the atb
      #          clock's force to run as "run", set this as %Q("run")
      :ecatb_force_run_text => %Q("ATB Force Run"),

      # Sets the atb force window text to be displayed when the atb clock's
      # forced to stop
      # Its corresponding method's created under ECATB_Force_Window
      # It must return a string
      # Example: To set the atb force window text to be displayed when the atb
      #          clock's force to run as "stop", set this as %Q("stop")
      :ecatb_force_stop_text => %Q("ATB Force Stop"),

      # Sets the atb force window text color
      # Its corresponding method's created under ECATB_Force_Window
      # It must return a color
      # Example: To set the atb force window text color's rgba values as r, g, b
      #          and a, set this as %Q(Color.new(r, g, b, a))
      :ecatb_force_text_color => %Q(Colour.text_colour(0)),

      # Sets the atb force window text size
      # Its corresponding method's created under ECATB_Force_Window
      # It must return a positive real number and should return a natural number
      # Example: To set the atb force window text size as the value of variable
      #          with id x, set this as %Q($game_variables[x])
      :ecatb_force_text_size => %Q(16),

      # Sets the atb force window text x and y positions
      # Its corresponding method's created under ECATB_Force_Window
      # It must return an array of real numbers and should return an array of
      # integers
      # Example: To set the atb force window text x and y positions as the value
      #          of variables with id a and b respectively, set this as
      #          %Q([$game_variables[a], $game_variables[b]])
      :ecatb_force_text_xy => %Q([0, 0])

    }

  #----------------------------------------------------------------------------|
  #  * Hotkey                                                                  |
  #    Setups configurations of the hotkey features                            |
  #----------------------------------------------------------------------------|

    #--------------------------------------------------------------------------|
    #  Hotkey Configurations                                                   |
    #  - Setups configurations of the hotkey features                          |
    #  - The value of each configuration is the string of the content of its   |
    #    corresponding method                                                  |
    #--------------------------------------------------------------------------|

    HOTKEY = {

      # Sets the hotkeys calling an actor in the status window that can input
      # actions or in the cancel window, or a battler in the target window
      # Its corresponding method's created under Scene_Battle
      # It must return an array of symbols and should return an array of
      # Input constants
      # The ith hotkey calls the actor with index i
      # Nothing will happen if the actor in the status window can't input
      # actions
      # Example: To disable this feature, set this as %Q([])
      :ecatb_battler_hotkeys => %Q([
        :NUMPAD1,
        :NUMPAD2,
        :NUMPAD3,
        :NUMPAD4,
        :NUMPAD5,
        :NUMPAD6,
        :NUMPAD7,
        :NUMPAD8,
        :NUMPAD9,
        :NUMPAD0
      ])

    }

  #----------------------------------------------------------------------------|
  #  * (v0.01a+)Order                                                          |
  #    Setups configurations of the order features                             |
  #----------------------------------------------------------------------------|

    #--------------------------------------------------------------------------|
    #  Order Battler Icon Notetag Values                                       |
    #  - Setups obix used by <ecatb order battler icon: obix> notetags         |
    #--------------------------------------------------------------------------|
    # obix are read at:
    # 1. RPG::Actor, RPG::Class, RPG::EquipItem, RPG::Enemy, RPG::State
    #    - next @ecatb_notes[:order_icon] = $1.downcase.to_sym in
    #      load_ecatb_notes
    # obix are used at:
    # 1. Game_BattlerBase
    #    - @ecatb_notes[note] = ecatb.send(n, self) in set_ecatb_notes
    # obix are strings of names of methods under DoubleX_RMVXA::ECATB
    # obix must return an array with its 1st and 2nd element being a bitmap and
    # a rect respectively
    # obix names can only use alphanumeric characters and can't use uppercase
    # letters
    # battler is the battler calling the obix
    # The below obix are examples added to help you set your obix
    # You can freely use, rewrite and/or delete these examples

    # Uses the actor character graphic with frame at 1st row and 2nd column
    def self.obi1(battler)
      bitmap = Cache.character(battler.actor.character_name)
      w = bitmap.width / 12
      h = bitmap.height / 8
      index = battler.actor.character_index
      [bitmap, Rect.new((index % 4 * 3 + 1) * w, (index / 4 * 4) * h, w, h)]
    end

    # Uses bitmap "Monsters2" in "Characters" with part at 1st row and 3rd
    # column and frame in that part at 1st row and 2nd column
    def self.obi2(battler)
      bitmap = Cache.character("Monster2")
      w = bitmap.width / 12
      h = bitmap.height / 8
      [bitmap, Rect.new((2 % 4 * 3 + 1) * w, (2 / 4 * 4) * h, w, h)]
    end

    # Adds new obix here
    

    #--------------------------------------------------------------------------|
    #  Order Battler Opacity Notetag Values                                    |
    #  - Setups obox used by <ecatb order battler opacity: obox> notetags      |
    #--------------------------------------------------------------------------|
    # obox are read at:
    # 1. RPG::Actor, RPG::Class, RPG::EquipItem, RPG::Enemy, RPG::State
    #    - next @ecatb_notes[:order_opacity] = $1.downcase.to_sym in
    #      load_ecatb_notes
    # obox are used at:
    # 1. Game_BattlerBase
    #    - @ecatb_notes[note] = ecatb.send(n, self) in set_ecatb_notes
    # obox are strings of names of methods under DoubleX_RMVXA::ECATB
    # obox must return a non-negative real number and should return a
    # non-negatve integer
    # obox names can only use alphanumeric characters and can't use uppercase
    # letters
    # battler is the battler calling the obox
    # The below obox are examples added to help you set your obox
    # You can freely use, rewrite and/or delete these examples

    # Sets the opacity of the icon representing its battler order as x
    def self.obo1(battler)
      x
    end

    # Sets the opacity of the icon representing its battler order as the value
    # of variable with id x
    def self.obo2(battler)
      $game_variables[x]
    end

    # Adds new obox here
    

    #--------------------------------------------------------------------------|
    #  Order Battler Scale Notetag Values                                      |
    #  - Setups obsx used by <ecatb order battler scale: obsx> notetags        |
    #--------------------------------------------------------------------------|
    # obsx are read at:
    # 1. RPG::Actor, RPG::Class, RPG::EquipItem, RPG::Enemy, RPG::State
    #    - next @ecatb_notes[:order_scale] = $1.downcase.to_sym in
    #      load_ecatb_notes
    # obsx are used at:
    # 1. Game_BattlerBase
    #    - @ecatb_notes[note] = ecatb.send(n, self) in set_ecatb_notes
    # obsx are strings of names of methods under DoubleX_RMVXA::ECATB
    # obsx must return a positive real number
    # obsx names can only use alphanumeric characters and can't use uppercase
    # letters
    # battler is the battler calling the obsx
    # The below obsx are examples added to help you set your obsx
    # You can freely use, rewrite and/or delete these examples

    # Sets the opacity of the icon representing its battler order as x
    def self.obs1(battler)
      x
    end

    # Sets the opacity of the icon representing its battler order as the value
    # of variable with id x
    def self.obs2(battler)
      $game_variables[x]
    end

    # Adds new obsx here
    

    #--------------------------------------------------------------------------|
    #  Order Battler Z Notetag Values                                          |
    #  - Setups obzx used by <ecatb order battler z: obzx> notetags            |
    #--------------------------------------------------------------------------|
    # obzx are read at:
    # 1. RPG::Actor, RPG::Class, RPG::EquipItem, RPG::Enemy, RPG::State
    #    - next @ecatb_notes[:order_z] = $1.downcase.to_sym in load_ecatb_notes
    # obzx are used at:
    # 1. Game_BattlerBase
    #    - @ecatb_notes[note] = ecatb.send(n, self) in set_ecatb_notes
    # obzx are strings of names of methods under DoubleX_RMVXA::ECATB
    # obzx must return a non-negative real number and should return a
    # non-negatve integer
    # obzx names can only use alphanumeric characters and can't use uppercase
    # letters
    # battler is the battler calling the obzx
    # The below obzx are examples added to help you set your obzx
    # You can freely use, rewrite and/or delete these examples

    # Sets the z position of the icon representing its battler order as x
    def self.obz1(battler)
      x
    end

    # Sets the z position of the icon representing its battler order as the
    # value of variable with id x
    def self.obz2(battler)
      $game_variables[x]
    end

    # Adds new obzx here
    

    #--------------------------------------------------------------------------|
    #  Order Configurations                                                    |
    #  - Setups configurations of the order features                           |
    #  - The value of each configuration is the string of the content of its   |
    #    corresponding method                                                  |
    #--------------------------------------------------------------------------|

    ORDER = {

      # Shows the battler order window
      # It's used under Scene_Battle but it doesn't have any associated method
      # Example: To show the battler atb window if switch with id x is on, set
      #          this as %Q($game_switches[x])
      :show_ecatb_order_window => %Q(true),

      # Sets the battler order window width and height
      # Its corresponding method's created under ECATB_Order_Window
      # It must return an array of positive real numbers and should return an
      # array of natural numbers
      # Example: To set the battler order window width and height as the value
      #          of variables with id x and y respectively, set this as
      #          %Q([$game_variables[x], $game_variables[y]])
      :ecatb_order_window_wh => %Q([128, 60]),

      # Sets the battler order window x, y and z positions
      # Its corresponding method's created under ECATB_Order_Window
      # It must return an array of real numbers and should return an array of
      # integers
      # Example: To set the battler order window x, y and z positions as the
      #          value of variables with id a, b and c respectively, set this as
      #     %Q([$game_variables[a], $game_variables[b], $game_variables[c]])
      :ecatb_order_window_xyz => %Q([0, 88, 0]),

      # Sets the battler order atb bar colors
      # Its corresponding method's created under ECATB_Order_Window
      # It must return an array of colors
      # Example: To set the battler order atb bar colors as text color c and r,
      #          g, b, a rgba values, set this as
      #          %Q([Colour.text_colour(c), Color.new(r, g, b, a)])
      :ecatb_order_bar_colors => %Q([Colour.text_colour(7), 
                                     Colour.text_colour(8)]),

      # Sets the battler order atb charge bar colors
      # Its corresponding method's created under ECATB_Order_Window
      # It must return an array of colors
      # Example: To set the battler order atb charge bar colors as text color c
      #          and r, g, b, a rgba values, set this as
      #          %Q([Colour.text_colour(c), Color.new(r, g, b, a)])
      :ecatb_order_charge_bar_colors => %Q([Colour.text_colour(30), 
                                            Colour.text_colour(31)]),

      # Sets the battler order atb cooldown bar colors
      # Its corresponding method's created under ECATB_Order_Window
      # It must return an array of colors
      # Example: To set the battler order atb cooldown bar colors as text color
      #          c and r, g, b, a rgba values, set this as
      #          %Q([Colour.text_colour(c), Color.new(r, g, b, a)])
      :ecatb_order_cooldown_bar_colors => %Q([Colour.text_colour(19), 
                                              Colour.text_colour(26)]),

      # Sets the battler order bars width and height
      # Its corresponding method's created under ECATB_Order_Window
      # It must return an array of positive real numbers and should return an
      # array of natural numbers
      # Example: To set the battler order bars width and height as the value of
      #          variables with id x and y respectively, set this as
      #          %Q([$game_variables[x], $game_variables[y]])
      :ecatb_order_bar_wh => %Q([108, 12]),

      # Sets the battler order bars x and y positions
      # Its corresponding method's created under ECATB_Order_Window
      # It must return an array of real numbers and should return an array of
      # integers
      # Example: To set the battler order bars x and y positions as the value of
      #          variables with id x and y respectively, set this as
      #          %Q([$game_variables[x], $game_variables[y]])
      :ecatb_order_bar_xy => %Q([0, 12]),

      # Sets the battler order atb bar text
      # Its corresponding method's created under ECATB_Order_Window
      # It must return a string
      # Example: To set the battler order atb bar text as "Norm", set this as
      #          %Q("Norm")
      :ecatb_order_bar_text => %Q("ATB"),

      # Sets the battler order atb charge bar text
      # Its corresponding method's created under ECATB_Order_Window
      # It must return a string
      # Example: To set the battler order atb charge bar text as "Charging", set
      #          this as %Q("Charging")
      :ecatb_order_charge_bar_text => %Q("Charge"),

      # Sets the battler order atb cooldown bar text
      # Its corresponding method's created under ECATB_Order_Window
      # It must return a string
      # Example: To set the battler order atb cooldown bar text as "Cooldown",
      #          set this as %Q("Cooldown")
      :ecatb_order_cooldown_bar_text => %Q("Cool"),

      # Sets the battler order bars text color
      # Its corresponding method's created under ECATB_Order_Window
      # It must return a color
      # Example: To set the battler order bars text color's rgba values as
      #          r, g, b and a, set this as %Q(Color.new(r, g, b, a))
      :ecatb_order_text_color => %Q(Colour.text_colour(0)),

      # Sets the battler order bars text size
      # Its corresponding method's created under ECATB_Order_Window
      # It must return a positive real number and should return a natural number
      # Example: To set the battler order bars text size as the value of
      #          variable with id x, set this as %Q($game_variables[x])
      :ecatb_order_text_size => %Q(12),

      # Sets the battler order bars text x and y positions
      # Its corresponding method's created under ECATB_Order_Window
      # It must return an array of real numbers and should return an array of
      # integers
      # Example: To set the battler order bars text x and y positions as the
      #          value of variables with id a and b respectively, set this as
      #          %Q([$game_variables[a], $game_variables[b]])
      :ecatb_order_text_xy => %Q([2, 14]),

      # Sets the icon representing the battlers in the battler order window
      # It'll be used only if no corresponding order battler icon notetags are
      # used
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # It must return an array with its 1st and 2nd element being a bitmap and
      # a rect respectively
      # Example: To use the icon with index x in the iconset, set this as
      #          %Q(
      #    [Cache.system("Iconset"), Rect.new(x % 16 * 24, x / 16 * 24, 24, 24)]
      #    ),
      :ecatb_order_battler_icon => %Q(
       [Cache.system("Iconset"), Rect.new(121 % 16 * 24, 121 / 16 * 24, 24, 24)]
      ),

      # Sets the priority of the ecatb order battler icon notetags to be used
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # It must return an array with elements being either :states, :enemies,
      # :armors, :weapons, :classes or :actors
      # Example: To set states to have a higher priority than that of actors,
      #          set this as %Q([:states, :actors])
      :ecatb_order_battler_icon_ord => %Q([:states, :enemies, :armors,
                                           :weapons, :classes, :actors]),

      # Sets the opacity of icons representing the battlers in the battler order
      # window
      # It'll be used only if no corresponding order battler icon notetags are
      # used
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # It must return a non-negative real number and should return an integer
      # between 0 and 255
      # Example: To set the opacity of icons representing the actors as the
      #          value of variable with id x, set this as %Q($game_variables[x])
      :ecatb_order_battler_opacity => %Q(255),

      # Sets the priority of the ecatb order battler opacity notetags to be used
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # It must return an array with elements being either :states, :enemies,
      # :armors, :weapons, :classes or :actors
      # Example: To set states to have a higher priority than that of actors,
      #          set this as %Q([:states, :actors])
      :ecatb_order_battler_opacity_ord => %Q([:states, :enemies, :armors, 
                                              :weapons, :classes, :actors]),

      # Sets the scale of icons representing the battlers in the battler order
      # window
      # It'll be used only if no corresponding order battler icon notetags are
      # used
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # It must return a positive real number
      # Example: To set the scale of icons representing the actors as the
      #          value of variable with id x, set this as %Q($game_variables[x])
      :ecatb_order_battler_scale => %Q(0.5),

      # Sets the priority of the ecatb order battler scale notetags to be used
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # It must return an array with elements being either :states, :enemies,
      # :armors, :weapons, :classes or :actors
      # Example: To set states to have a higher priority than that of actors,
      #          set this as %Q([:states, :actors])
      :ecatb_order_battler_scale_ord => %Q([:states, :enemies, :armors, 
                                            :weapons, :classes, :actors]),

      # Sets the z position of icons representing the battlers in the battler
      # order window
      # It'll be used only if no corresponding order battler icon notetags are
      # used
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # It must return a non-negative real number and should return a
      # non-negatve integer
      # Example: To set the z position of icons representing the actors as the
      #          value of variable with id x, set this as %Q($game_variables[x])
      :ecatb_order_battler_z => %Q(500),

      # Sets the priority of the ecatb order battler z notetags to be used
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # It must return an array with elements being either :states, :enemies,
      # :armors, :weapons, :classes or :actors
      # Example: To set states to have a higher priority than that of actors,
      #          set this as %Q([:states, :actors])
      :ecatb_order_battler_z_ord => %Q([:states, :enemies, :armors, :weapons, 
                                        :classes, :actors]),

      # Sets the x position of icons representing the battlers in the battler
      # order window
      # It must return a real number and should return an integer
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # Example: To set the x position of icons representing the battlers as the
      #          value of variable with id x, set this as %Q($game_variables[x])
      :ecatb_order_battler_icon_x => %Q(4),

      # Sets the y position of icons representing the actors in the battler
      # order window
      # It must return a real number and should return an integer
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # Example: To set the y position of icons representing the actors as the
      #          value of variable with id x, set this as %Q($game_variables[x])
      :ecatb_order_actor_icon_y => %Q(36),

      # Sets the y position of icons representing the enemies in the battler
      # order window
      # It must return a real number and should return an integer
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # Example: To set the y position of icons representing the enemies as the
      #          value of variable with id x, set this as %Q($game_variables[x])
      :ecatb_order_enemy_icon_y => %Q(8)

    }

  #----------------------------------------------------------------------------|
  #  * Pool                                                                    |
  #    Setups configurations of the pool features                              |
  #----------------------------------------------------------------------------|

    #--------------------------------------------------------------------------|
    #  Pool Configurations                                                     |
    #  - Setups configurations of the pool features                            |
    #  - The value of each configuration is the string of the content of its   |
    #    corresponding method                                                  |
    #--------------------------------------------------------------------------|

    POOL = {

      # Evaluates the party/troop pool atb value from all actors/enemies' ones
      # The actors/enemies' atb values can be referenced by vals
      # Its corresponding method's created under Game_Party and Game_Troop
      # It must return a non-negative real number and should return a
      # non-negative integer
      # Example: To use the minimum atb value of all actors/enemies, set this as
      #          %Q(vals.empty? ? 0 : vals.min)
      :ecatb_pool_val => %Q(vals.empty? ? 0 : vals.inject(:+) / vals.size),

      # Shows the atb pool window displaying the atb mode
      # It's used under Scene_Battle but it doesn't have any associated method
      # Example: To show the atb pool window if switch with id x is on, set
      #          this as %Q($game_switches[x])
      :show_ecatb_pool_window => %Q(true),

      # Sets the atb pool window width and height
      # Its corresponding method's created under ECATB_Pool_Window
      # It must return an array of positive real numbers and should return an
      # array of natural numbers
      # Example: To set the atb pool window width and height as the value of
      #          variables with id x and y respectively, set this as
      # %Q([$game_variables[x], $game_variables[y]])
      :ecatb_pool_window_wh => %Q([128, 56]),

      # Sets the atb pool widnow x, y and z positions
      # Its corresponding method's created under ECATB_Pool_Window
      # It must return an array of real numbers and should return an array of
      # integers
      # Example: To set the atb pool window x, y and z positions as the value
      #          of variables with id a, b and c respectively, set this as
      # %Q([$game_variables[a], $game_variables[b], $game_variables[c]])
      :ecatb_pool_window_xyz => %Q([0, 148, 0]),

      # Sets the party atb pool window text to be displayed
      # Its corresponding method's created under ECATB_Pool_Window
      # It must return an array of strings
      # The 1st and 2nd element of the array is displayed when the atb pool
      # mode's on and off respectively
      # Example: To set the party atb pool window text to be displayed when the
      #          atb pool mode's on and off as "Party ATB Pool Mode On" and
      #          "Party ATB Pool Mode Off" respectively, set this as 
      #          %Q(["Party ATB Pool Mode On", "Party ATB Pool Mode Off"])
      :ecatb_pool_party_actor_text => %Q(["Party ATB", "Actor ATB"]),

      # Sets the troop atb pool window text to be displayed
      # Its corresponding method's created under ECATB_Pool_Window
      # It must return an array of strings
      # The 1st and 2nd element of the array is displayed when the atb pool
      # mode's on and off respectively
      # Example: To set the troop atb pool window text to be displayed when the
      #          atb pool mode's on and off as "Troop ATB Pool Mode On" and
      #          "Troop ATB Pool Mode Off" respectively, set this as 
      #          %Q(["Troop ATB Pool Mode On", "Troop ATB Pool Mode Off"])
      :ecatb_pool_troop_enemy_text => %Q(["Troop ATB", "Enemy ATB"]),

      # Sets the atb pool window text color
      # Its corresponding method's created under ECATB_Pool_Window
      # It must return a color
      # Example: To set the atb pool window text color's rgba values as r, g, b
      #          and a, set this as %Q(Color.new(r, g, b, a))
      :ecatb_pool_text_color => %Q(Colour.text_colour(0)),

      # Sets the atb pool window text size
      # Its corresponding method's created under ECATB_Pool_Window
      # It must return a positive real number and should return a natural number
      # Example: To set the atb pool window text size as the value of variable
      #          with id x, set this as %Q($game_variables[x])
      :ecatb_pool_text_size => %Q(16),

      # Sets the atb party pool window text x and y positions
      # Its corresponding method's created under ECATB_Pool_Window
      # It must return an array of real numbers and should return an array of
      # integers
      # Example: To set the atb party pool window text x and y positions as the
      #          value of variables with id a and b respectively, set this as
      #          %Q([$game_variables[a], $game_variables[b]])
      :ecatb_pool_party_text_xy => %Q([0, 8]),

      # Sets the atb troop pool window text x and y positions
      # Its corresponding method's created under ECATB_Pool_Window
      # It must return an array of real numbers and should return an array of
      # integers
      # Example: To set the atb troop pool window text x and y positions as the
      #          value of variables with id a and b respectively, set this as
      #          %Q([$game_variables[a], $game_variables[b]])
      :ecatb_pool_troop_text_xy => %Q([0, -8])

    }

  #----------------------------------------------------------------------------|
  #  * SE                                                                      |
  #    Setups configurations of the se features                                |
  #----------------------------------------------------------------------------|

    #--------------------------------------------------------------------------|
    #  SE Ready Act Notetag Values                                             |
    #  - Setups serax used by <ecatb se ready act: serax> notetags             |
    #--------------------------------------------------------------------------|
    # serax are read at:
    # 1. RPG::Actor, RPG::Class, RPG::EquipItem, RPG::Enemy, RPG::State
    #    - next @ecatb_notes[:se] = $1.downcase.to_sym in load_ecatb_notes
    # serax are used at:
    # 1. Game_BattlerBase
    #    - @ecatb_notes[note] = ecatb.send(n, self) in set_ecatb_notes
    # serax are strings of names of methods under DoubleX_RMVXA::ECATB
    # serax names can only use alphanumeric characters and can't use uppercase
    # letters
    # battler is the battler calling the serax
    # The below serax are examples added to help you set your serax
    # You can freely use, rewrite and/or delete these examples

    # Sets the battler ready se as se with name "name", volume volume and pitch
    # pitch
    def self.sera1(battler)
      RPG::SE.new("file", volume, pitch)
    end

    # Disables the use of the battler ready se
    def self.sera2(battler)
      nil
    end

    # Adds new serax here
    

    #--------------------------------------------------------------------------|
    #  SE Configurations                                                       |
    #  - Setups configurations of the se features                              |
    #  - The value of each configuration is the string of the content of its   |
    #    corresponding method                                                  |
    #--------------------------------------------------------------------------|

    SE = {

      # Sets the se to be played when a battler becomes able to act
      # It'll be used only if no corresponding color notetags are used
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # Example: To set the se to be played when a battler becomes able to act
      #          as se with name "name", volume volume and pitch pitch, set this
      #          as %Q(RPG::SE.new("name", volume, pitch))
      :ecatb_se_ready_act => %Q(nil),

      # Sets the priority of the ecatb se ready act notetags to be used
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # It must return an array with elements being either :states, :enemies,
      # :armors, :weapons, :classes or :actors
      # Example: To set states to have a higher priority than that of actors,
      #          set this as %Q([:states, :actors])
      :ecatb_se_ready_act_ord => %Q([:states, :enemies, :armors, :weapons, 
                                     :classes, :actors])

    }

  #----------------------------------------------------------------------------|
  #  * (v0.02a+)Speed                                                          |
  #    Setups configurations and notetag values of the speed features          |
  #----------------------------------------------------------------------------|

    #--------------------------------------------------------------------------|
    #  Speed Reduce Notetag Values                                             |
    #  - Setups srx used by <ecatb speed reduce: srx> notetags                 |
    #--------------------------------------------------------------------------|
    # srx are read at:
    # 1. RPG::Actor, RPG::Class, RPG::EquipItem, RPG::Enemy, RPG::State
    #    - next @ecatb_notes[:speed] << $1.downcase.to_sym in load_ecatb_notes
    # srx are used at:
    # 1. Game_BattlerBase
    #    - ecatb.send(note, self) in set_ecatb_speed_reduce
    # srx are strings of names of methods under DoubleX_RMVXA::ECATB
    # srx must return a non-negative integer
    # srx names can only use alphanumeric characters and can't use uppercase
    # letters
    # battler is the battler calling the srx
    # The below srx are examples to help you set your srx
    # You can freely use, rewrite and/or delete these examples

    # Sets the action input speed reduction as x frames
    def self.sr1(battler)
      battler.instance_exec { @last_ecatb_speed_reduce = x }
    end

    # Sets the action input speed reduction as the number of frames being the
    # value of variable with id x
    def self.sr2(battler)
      battler.instance_exec { @last_ecatb_speed_reduce = $game_variables[x] }
    end

    # Adds the action input speed reduction by x frames
    def self.sr3(battler)
      battler.instance_exec { @last_ecatb_speed_reduce += x }
    end

    # Adds new srx here
    

    #--------------------------------------------------------------------------|
    #  Speed Configurations                                                    |
    #  - Setups configurations of the speed features                           |
    #  - The value of each configuration is the string of the content of its   |
    #    corresponding method                                                  |
    #--------------------------------------------------------------------------|

    SPEED = {

      # Sets the action input speed reduction for enemies and/or actors with
      # autobattle and/or confusion
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # It must return a non-negative integer
      # Example: To set the action input speed reduction for enemies and/or
      #          actors with autobattle and/or confusion as the value of
      #          variable with id x, set this as
      #          %Q(@last_ecatb_speed_reduce = $game_variables[x])
      :ecatb_speed_reduce => %Q(@last_ecatb_speed_reduce = 0),

      # Sets the priority of the ecatb speed reduce notetags to be used
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # It must return an array with elements being either :states, :enemies,
      # :armors, :weapons, :classes or :actors
      # Example: To set actors to have a higher priority than that of states,
      #          set this as %Q([:actors, :states])
      :ecatb_speed_reduce_ord => %Q([:actors, :classes, :weapons, :armors, 
                                     :enemies, :states])

    }

  #----------------------------------------------------------------------------|
  #  * Unison                                                                  |
  #    Setups configurations of the unison features                            |
  #----------------------------------------------------------------------------|

    #--------------------------------------------------------------------------|
    #  Unison Actor Notetag Values                                             |
    #  - Setups uax used by <ecatb unison actor: uax> notetags                 |
    #--------------------------------------------------------------------------|
    # uax are read at:
    # 1. RPG::UsableItem
    #    - send(:"#{note}=", send(:"#{note}") || val) in load_ecatb_notes
    # uax are used at:
    # 1. Game_BattlerBase
    #    - actors = ecatb.send(item.ecatb_unison_actor, self).collect!(
    #      &ecatb::BLOCKS[:usable?]) in usable?
    # 2. Game_Actor
    #    - @ecatb_unison_actors = ecatb.send(
    #      @last_ecatb_item.ecatb_unison_actor, self) in confirm_ecatb_item
    # 3. Window_ItemList
    #    - return battler.usable?(item) if (ecatb = DoubleX_RMVXA::ECATB).send(
    #      item.ecatb_act_cost, battler) > 1 || ecatb.send(
    #      item.ecatb_unison_actor, battler).size > 1 in enable?
    # 4. Scene_Battle
    #    - actors = ecatb.send($data_skills[actor.attack_skill_id].
    #      ecatb_unison_actor, actor).collect!(&ecatb::BLOCKS[:usable?]) in
    #      command_attack
    #    - actors = ecatb.send($data_skills[actor.guard_skill_id].
    #      ecatb_unison_actor, actor).collect!(&ecatb::BLOCKS[:usable?]) in
    #      command_guard
    #    - actors = ecatb.send(window.item.ecatb_unison_actor,
    #      BattleManager.actor) in on_ecatb_unison_item_ok?
    #    - actors = ecatb.send(actor.input.item.ecatb_unison_actor, actor) in
    #      on_ecatb_unison?
    # uax are strings of names of methods under DoubleX_RMVXA::ECATB
    # uax shouldn't return random values
    # uax must return an array of actor ids and the array must have more
    # than 1 actor ids
    # uax names can only use alphanumeric characters and can't use uppercase
    # letters
    # battler is the battler calling the uax
    # The below uax are examples added to help you set your uax
    # You can freely use, rewrite and/or delete these examples

    # Sets the unison actors as those with id x, y and z respectively
    def self.ua1(battler)
      [x, y, z]
    end

    # Adds new uax here
    

    # Don't edit this unless you understand what it does and how it works
    def self.ecatb_unison_actor(battler)
      []
    end

    #--------------------------------------------------------------------------|
    #  Unison Charge Rule Notetag Values                                       |
    #  - Setups ucrx used by <ecatb unison charge rule: ucrx> notetags         |
    #--------------------------------------------------------------------------|
    # ucrx are read at:
    # 1. RPG::UsableItem
    #    - send(:"#{note}=", send(:"#{note}") || val) in load_ecatb_notes
    # ucrx are used at:
    # 1. Game_Actor
    #    - @ecatb_unison_rule[:charge] = ecatb.send(
    #      @last_ecatb_item.ecatb_unison_charge_rule, self) in
    #      confirm_ecatb_item
    # ucrx are strings of names of methods under DoubleX_RMVXA::ECATB
    # ucrx must return a symbol
    # You must implement the rule in ecatb_unison_rules
    # ucrx names can only use alphanumeric characters and can't use uppercase
    # letters
    # battler is the battler calling the ucrx
    # The below ucrx are examples added to help you set your ucrx
    # You can freely use, rewrite and/or delete these examples

    # Sets the unison charge rule as returning the maximum
    def self.ucr1(battler)
      :max
    end

    # Adds new ucrx here
    

    # Sets the default unison charge rule
    # It'll be used for def only if it's no ucrx to use
    # battler is the battler calling ecatb_unison_charge_rule
    # Example: To set the default unison charge rule as returning the minimum,
    # set this as %Q(:min)
    def self.ecatb_unison_charge_rule(battler)
      :avg
    end

    #--------------------------------------------------------------------------|
    #  Unison Cooldown Rule Notetag Values                                     |
    #  - Setups ucdrx used by <ecatb unison cooldown rule: ucdrx> notetags     |
    #--------------------------------------------------------------------------|
    # ucdrx are read at:
    # 1. RPG::UsableItem
    #    - send(:"#{note}=", send(:"#{note}") || val) in load_ecatb_notes
    # ucdrx are used at:
    # 1. Game_Actor
    #    - @ecatb_unison_rule[:cooldown] = ecatb.send(
    #      @last_ecatb_item.ecatb_unison_cooldown_rule, self) in
    #      confirm_ecatb_item
    # ucdrx are strings of names of methods under DoubleX_RMVXA::ECATB
    # ucdrx must return a symbol
    # You must implement the rule in ecatb_unison_rules
    # ucdrx names can only use alphanumeric characters and can't use uppercase
    # letters
    # battler is the battler calling the ucdrx
    # The below UCDRX are examples added to help you set your ucdrx
    # You can freely use, rewrite and/or delete these examples

    # Sets the unison cooldown rule as returning the maximum
    def self.ucdr1(battler)
      :max
    end

    # Adds new ucdrx here
    

    # Sets the default unison charge rule
    # It'll be used for def only if it's no ucdrx to use
    # battler is the battler calling ecatb_unison_cooldown_rule
    # Example: To set the default unison cooldown rule as returning the minimum,
    # set this as %Q(:min)
    def self.ecatb_unison_cooldown_rule(battler)
      :avg
    end

    #--------------------------------------------------------------------------|
    #  Unison Actor Method Notetag Values                                      |
    #  - Setups uadx used by <ecatb unison actor def: uadx> notetags           |
    #--------------------------------------------------------------------------|
    # uadx are read at:
    # 1. RPG::UsableItem
    #    - send(:"#{note}=", send(:"#{note}") || val) in load_ecatb_notes
    # uadx are used at methods included in UNISON_DEFS
    # uadx are strings of names of methods under DoubleX_RMVXA::ECATB
    # uadx must return an array of actor ids
    # uadx names can only use alphanumeric characters and can't use uppercase
    # letters
    # battler is the battler calling the uadx
    # The below uadx are examples added to help you set your uadx
    # You can freely use, rewrite and/or delete these examples

    # Sets the def used to be those of actors with id x, y and z respectively
    def self.uad1(battler)
      [x, y, z]
    end

    # Adds new uadx here
    

    # Don't edit this unless you understand what it does and how it works
    def self.ecatb_unison_actor_def(battler)
      []
    end

    #--------------------------------------------------------------------------|
    #  Unison Method Rule Notetag Values                                       |
    #  - Setups udrx used by <ecatb unison def rule: udrx> notetags            |
    #--------------------------------------------------------------------------|
    # udrx are read at:
    # 1. RPG::UsableItem
    #    - send(:"#{note}=", send(:"#{note}") || val) in load_ecatb_notes
    # udrx are used at methods included in UNISON_DEFS
    # udrx are strings of names of methods under DoubleX_RMVXA::ECATB
    # udrx must return a symbol
    # You must implement the rule in ecatb_unison_rules
    # udrx names can only use alphanumeric characters and can't use uppercase
    # letters
    # battler is the battler calling the udrx
    # The below udrx are examples added to help you set your udrx
    # You can freely use, rewrite and/or delete these examples

    # Sets the unison method rule as returning the maximum
    UDR1 = %Q(:max)
    def self.udr1(battler)
      :max
    end

    # Adds new udrx here
    

    # Sets the default unison method rule
    # It'll be used for def only if it's no udrx to use
    # battler is the battler calling ecatb_unison_def_rule
    # Example: To set the default unison mthod rule as returning the minimum,
    # set this as %Q(:min)
    def self.ecatb_unison_def_rule(battler)
      :avg
    end

    #--------------------------------------------------------------------------|
    #  Unison Configurations                                                   |
    #  - Setups configurations of the unison features                          |
    #  - The value of each configuration is the string of the content of its   |
    #    corresponding method                                                  |
    #--------------------------------------------------------------------------|

    # Sets the battler methods to use the unison method rules
    # It can't be chnaged once set
    # Its keys must be the battler method name symbols
    # Methods with name method_name will be aliased to method_name_ecatb
    UNISON_DEFS = {

      # General Form:
      # [:method_class, :super_class] => [
      #   :method_name
      # ]

      [:Game_BattlerBase] => [
        :hp,
        :mp,
        :tp,
        :mhp,
        :mmp,
        :atk,
        :def,
        :mat,
        :mdf,
        :agi
        # Adds new methods here
        
      ],

      [:Game_Actor, :Game_Battler] => [
        :level
        # Adds new methods here
        
      ]

      # Adds new classes here
      

    }

    UNISON = {

      # Sets if all battlers using the unison skill/item are shown in the
      # battle log window
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # Example: To show all battlers using the unison skill/item if switch with
      #          id x is on, set this as %Q($game_switches[x])
      :show_ecatb_unison_battlers => %Q(true),

      # Implements the unison method rules
      # The unison method of all unison battlers can be referneced by vals
      # The unison method rule can be referenced by rule
      # Its corresponding method's created under Game_Actor and Game_Enemy
      # It must return a real number
      :ecatb_unison_rules => %Q(
        if rule == :min
          vals.min
        elsif rule == :avg
          vals.inject(:+) / vals.size
        elsif rule == :max
          vals.max
        else
          0
        end
      )

    }

#==============================================================================|

#==============================================================================|
#  ** Script Implementations                                                   |
#     You need not edit this part as it's about how this script works          |
#     You need to understand the related parts of a configuration/notetag value|
#     locally to fully utilize that configuration/notetag value                |
#------------------------------------------------------------------------------|
#  * Script Support Info:                                                      |
#    1. Prerequisites                                                          |
#       - Thorough comprehension of how this script works on the user level    |
#       - Thorough comprehension of how Yanfly Engine Ace - Ace Battle Engine  |
#         works                                                                |
#       - Advanced RGSS3 scripting proficiency to fully comprehend this script |
#    2. Method documentation                                                   |
#       - The 1st part describes why this method's rewritten/aliased for       |
#         rewritten/aliased methods or what the method does for new methods    |
#       - The 2nd part describes what the arguments of the method are          |
#       - The 3rd part informs which version rewritten, aliased or created this|
#         method                                                               |
#       - The 4th part informs whether the method's rewritten or new           |
#       - The 5th part informs whether the method's a real or potential hotspot|
#       - The 6th part describes how this method works for new methods only,   |
#         and describes the parts added, removed or rewritten for rewritten or |
#         aliased methods only                                                 |
#       Example:                                                               |
# #--------------------------------------------------------------------------| |
# #  Why rewrite/alias/What this method does                                 | |
# #--------------------------------------------------------------------------| |
# # *argv: What these variables are                                            |
# # &argb: What this block is                                                  |
# def def_name(*argv, &argb) # Version X+; Rewrite/New; Hotspot                |
#   # Added/Removed/Rewritten to do something/How this method works            |
#   def_name_code                                                              |
#   #                                                                          |
# end # def_name                                                               |
#------------------------------------------------------------------------------|

    # Stores all types of configurations
    CONFIG = [CORE, ACTION, BAR, CANCEL, CHARGE, CLOCK, COOLDOWN, COUNTDOWN, 
              FORCE, HOTKEY, ORDER, POOL, SE, SPEED, UNISON]

    # Stores all configurations having methods in BattleManager
    # General form: :config => [
    #                 %Q(arguments),
    #                 %Q(validation check),
    #                 %Q(default value)
    #               ]
    BATTLEMANAGER = {
      :ecatb_esc_init_cond => [
        %Q(),
        %Q(true),
        %Q((list = ecatb_input_list).size >= $game_party.battle_members.size && 
           list.all?(&DoubleX_RMVXA::ECATB::EIC1))
      ],
      :ecatb_esc_charge_cond => [
        %Q(),
        %Q(true),
        %Q($game_party.battle_members.all?(&DoubleX_RMVXA::ECATB::ECC1))
      ],
      :ecatb_esc_exec_cond => [
        %Q(),
        %Q(true),
        %Q($game_party.alive_members.all?(&DoubleX_RMVXA::ECATB::EEC1))
      ],
      :ecatb_esc_suc_cond => [
        %Q(),
        %Q(true),
        %Q((@preemptive || rand < @escape_ratio) && 
           $game_party.alive_members.all?(&DoubleX_RMVXA::ECATB::EIC1))
      ],
      :ecatb_base_fill_t => [
        %Q(),
        %Q(val.is_a?(Numeric) && val >= 0),
        %Q(10)
      ],
      :ecatb_ctb => [
        %Q(),
        %Q(true),
        %Q(false),
      ],
      :ecatb_battlers_def_sum => [
        %Q(),
        %Q(val.is_a?(Array) && 
           val.all?(&DoubleX_RMVXA::ECATB::BLOCKS[:check_sym])),
        %Q([:agi])
      ],
      :ecatb_def_sum_battlers => [
        %Q(),
        %Q(val.is_a?(Array) && 
           val.all?(&DoubleX_RMVXA::ECATB::BLOCKS[:check_game_battler])),
        %Q($game_party.alive_members + $game_troop.alive_members)
      ],
      :update_ecatb_battlers_def_sums => [
        %Q(),
        %Q(true),
        %Q(ecatb_def_sum_battlers.any?(
           &DoubleX_RMVXA::ECATB::BLOCKS[:ecatb_refresh]))
      ],
      :actor_sprite_ecatb_bar => [
        %Q(),
        %Q(true),
        %Q(false)
      ],
    }

    # Stores all configurations having methods in Game_Battler
    # General form: :config => [
    #                 %Q(arguments),
    #                 %Q(validation check),
    #                 %Q(default value)
    #               ]
    GAME_BATTLER = {
      :ecatb_rate_ord => [
        %Q(),
        %Q(val.is_a?(Array) && 
           val.all?(&DoubleX_RMVXA::ECATB::BLOCKS[:check_ord])),
        %Q([:actors, :classes, :weapons, :armors, :enemies, :states])
      ],
      :normal_actor_1st_ecatb_val => [
        %Q(),
        %Q(val.is_a?(Numeric) && val >= 0),
        %Q(0.0)
      ],
      :normal_enemy_1st_ecatb_val => [
        %Q(),
        %Q(val.is_a?(Numeric) && val >= 0),
        %Q(0.0)
      ],
      :preemptive_actor_1st_ecatb_val => [
        %Q(),
        %Q(val.is_a?(Numeric) && val >= 0),
        %Q(100.0)
      ],
      :preemptive_enemy_1st_ecatb_val => [
        %Q(),
        %Q(val.is_a?(Numeric) && val >= 0),
        %Q(0.0)
      ],
      :surprise_actor_1st_ecatb_val => [
        %Q(),
        %Q(val.is_a?(Numeric) && val >= 0),
        %Q(0.0)
      ],
      :surprise_enemy_1st_ecatb_val => [
        %Q(),
        %Q(val.is_a?(Numeric) && val >= 0),
        %Q(100.0)
      ],
      :ecatb_start_val_ord => [
        %Q(),
        %Q(val.is_a?(Array) && 
           val.all?(&DoubleX_RMVXA::ECATB::BLOCKS[:check_ord])),
        %Q([:actors, :classes, :weapons, :armors, :enemies, :states])
      ],
      :pre_ecatb_input_act => [
        %Q(),
        %Q(true),
        %Q()
      ],
      :post_ecatb_input_act => [
        %Q(),
        %Q(true),
        %Q()
      ],
      :pre_ecatb_reset => [
        %Q(),
        %Q(true),
        %Q()
      ],
      :post_ecatb_reset => [
        %Q(),
        %Q(true),
        %Q()
      ],
      :ecatb_bar_colors => [
        %Q(),
        %Q(val.is_a?(Array) && val[0].is_a?(Color) && val[1].is_a?(Color)),
        %Q([Colour.text_colour(7), Colour.text_colour(8)])
      ],
      :ecatb_bar_color_ord => [
        %Q(),
        %Q(val.is_a?(Array) && 
           val.all?(&DoubleX_RMVXA::ECATB::BLOCKS[:check_ord])),
        %Q([:states, :enemies, :armors, :weapons, :classes, :actors])
      ],
      :gradual_ecatb_action_gain => [
        %Q(),
        %Q(true),
        %Q(false),
      ],
      :gradual_ecatb_action_gain_ord => [
        %Q(),
        %Q(val.is_a?(Array) && 
           val.all?(&DoubleX_RMVXA::ECATB::BLOCKS[:check_ord])),
        %Q([:states, :enemies, :armors, :weapons, :classes, :actors])
      ],
      :ecatb_bar_multilayer => [
        %Q(),
        %Q(true),
        %Q(true)
      ],
      :ecatb_charge_bar_colors => [
        %Q(),
        %Q(val.is_a?(Array) && val[0].is_a?(Color) && val[1].is_a?(Color)),
        %Q([Colour.text_colour(30), Colour.text_colour(31)])
      ],
      :ecatb_charge_bar_color_ord => [
        %Q(),
        %Q(val.is_a?(Array) && 
           val.all?(&DoubleX_RMVXA::ECATB::BLOCKS[:check_ord])),
        %Q([:states, :enemies, :armors, :weapons, :classes, :actors])
      ],
      :ecatb_cooldown_bar_colors => [
        %Q(),
        %Q(val.is_a?(Array) && val[0].is_a?(Color) && val[1].is_a?(Color)),
        %Q([Colour.text_colour(19), Colour.text_colour(26)])
      ],
      :ecatb_cooldown_bar_color_ord => [
        %Q(),
        %Q(val.is_a?(Array) && 
           val.all?(&DoubleX_RMVXA::ECATB::BLOCKS[:check_ord])),
        %Q([:states, :enemies, :armors, :weapons, :classes, :actors])
      ],
      :ecatb_cooldown_finish => [
        %Q(),
        %Q(true),
        %Q()
      ],
      :ecatb_countdown_min => [
        %Q(),
        %Q(val.is_a?(Integer) && val >= 0),
        %Q(Graphics.frame_rate)
      ],
      :ecatb_order_battler_icon => [
        %Q(),
        %Q(val.is_a?(Array) && val[0].is_a?(Bitmap) && val[1].is_a?(Rect)),
        %Q(
       [Cache.system("Iconset"), Rect.new(121 % 16 * 24, 121 / 16 * 24, 24, 24)]
        )
      ],
      :ecatb_order_battler_icon_ord => [
        %Q(),
        %Q(val.is_a?(Array) && 
           val.all?(&DoubleX_RMVXA::ECATB::BLOCKS[:check_ord])),
        %Q([:states, :enemies, :armors, :weapons, :classes, :actors])
      ],
      :ecatb_order_battler_opacity => [
        %Q(),
        %Q(val.is_a?(Numeric) && val >= 0),
        %Q(255)
      ],
      :ecatb_order_battler_opacity_ord => [
        %Q(),
        %Q(val.is_a?(Array) && 
           val.all?(&DoubleX_RMVXA::ECATB::BLOCKS[:check_ord])),
        %Q([:states, :enemies, :armors, :weapons, :classes, :actors])
      ],
      :ecatb_order_battler_scale => [
        %Q(),
        %Q(val.is_a?(Numeric) && val >= 0),
        %Q(0.5)
      ],
      :ecatb_order_battler_scale_ord => [
        %Q(),
        %Q(val.is_a?(Array) && 
           val.all?(&DoubleX_RMVXA::ECATB::BLOCKS[:check_ord])),
        %Q([:states, :enemies, :armors, :weapons, :classes, :actors])
      ],
      :ecatb_order_battler_z => [
        %Q(),
        %Q(val.is_a?(Numeric) && val >= 0),
        %Q(500)
      ],
      :ecatb_order_battler_z_ord => [
        %Q(),
        %Q(val.is_a?(Array) && 
           val.all?(&DoubleX_RMVXA::ECATB::BLOCKS[:check_ord])),
        %Q([:states, :enemies, :armors, :weapons, :classes, :actors])
      ],
      :ecatb_order_battler_icon_x => [
        %Q(),
        %Q(val.is_a?(Numeric)),
        %Q(4)
      ],
      :ecatb_se_ready_act => [
        %Q(),
        %Q(true),
        %Q(nil)
      ],
      :ecatb_se_ready_act_ord => [
        %Q(),
        %Q(val.is_a?(Array) && 
           val.all?(&DoubleX_RMVXA::ECATB::BLOCKS[:check_ord])),
        %Q([:states, :enemies, :armors, :weapons, :classes, :actors])
      ],
      :ecatb_speed_reduce => [
        %Q(),
        %Q(val.is_a?(Numeric) && val >= 0),
        %Q(0)
      ],
      :ecatb_speed_reduce_ord => [
        %Q(),
        %Q(val.is_a?(Array) && 
           val.all?(&DoubleX_RMVXA::ECATB::BLOCKS[:check_ord])),
        %Q([:actors, :classes, :weapons, :armors, :enemies, :states])
      ],
      :show_ecatb_unison_battlers => [
        %Q(),
        %Q(true),
        %Q(true)
      ],
      :ecatb_unison_rules => [
        %Q((vals, rule)),
        %Q(val.is_a?(Numeric)),
        %Q(
    if rule == :min
      vals.min
    elsif rule == :avg
      vals.inject(:+) / vals.size
    elsif rule == :max
      vals.max
    end
        )
      ]
    }

    # Stores all configurations having methods in Game_Actor
    # General form: :config => [
    #                 %Q(arguments),
    #                 %Q(validation check),
    #                 %Q(default value)
    #               ]
    GAME_ACTOR = GAME_BATTLER.merge({
      :ecatb_esc_act_cost => [
        %Q(),
        %Q(val.is_a?(Numeric)),
        %Q(1)
      ],
      :ecatb_esc_reset_val => [
        %Q(),
        %Q(val.is_a?(Numeric)),
        %Q(0.0)
      ],
      :esc_ecatb_charge_rate => [
        %Q((charge)),
        %Q(val.is_a?(Numeric) && val >= 0),
        %Q(100.0)
      ],
      :esc_ecatb_cooldown_rate => [
        %Q((cooldown)),
        %Q(val.is_a?(Numeric) && val >= 0),
        %Q(100.0)
      ],
      :ecatb_order_actor_icon_y => [
        %Q(),
        %Q(val.is_a?(Numeric)),
        %Q(36)
      ]
    })

    # (v0.01a+)Stores all configurations having methods in Game_Enemy
    # General form: :config => [
    #                 %Q(arguments),
    #                 %Q(validation check),
    #                 %Q(default value)
    #               ]
    GAME_ENEMY = GAME_BATTLER.merge({
      :ecatb_order_enemy_icon_y => [
        %Q(),
        %Q(val.is_a?(Numeric)),
        %Q(8)
      ]
    })

    # Stores all configurations having methods in Game_Party and Game_Troop
    # General form: :config => [
    #                 %Q(arguments),
    #                 %Q(validation check),
    #                 %Q(default value)
    #               ]
    GAME_PARTY_TROOP = {
      :ecatb_pool_val => [
        %Q((vals)),
        %Q(val.is_a?(Numeric) && val >= 0),
        %Q(vals.empty? ? 0 : vals.inject(:+) / vals.size)
      ]
    }

    # Stores all configurations having methods in ECATB_Bar
    # General form: :config => [
    #                 %Q(arguments),
    #                 %Q(validation check),
    #                 %Q(default value)
    #               ]
    ECATB_BAR = {
      :ecatb_bar_ani => [
        %Q(),
        %Q(true),
        %Q(true)
      ],
      :ecatb_bar_ani_ox => [
        %Q(),
        %Q(val.is_a?(Numeric)),
        %Q(2)
      ],
      :ecatb_bar_wh => [
        %Q(),
        %Q(val.is_a?(Array) && val[0].is_a?(Numeric) && val[0] >= 0 && 
           val[1].is_a?(Numeric) && val[1] >= 0),
        %Q([48, 12])
      ],
      :ecatb_bar_xy_offset => [
        %Q(),
        %Q(val.is_a?(Array) && val[0].is_a?(Numeric) &&val[1].is_a?(Numeric)),
        %Q([0, 0])
      ],
      :ecatb_bar_z => [
        %Q(),
        %Q(val.is_a?(Numeric) && val >= 0),
        %Q(0)
      ],
      :ecatb_bar_text => [
        %Q((percent, act)),
        %Q("val.is_a?(String)"),
        %Q(percent + "% " + act)
      ],
      :ecatb_bar_text_color => [
        %Q(),
        %Q(val.is_a?(Color)),
        %Q(Colour.text_colour(0))
      ],
      :ecatb_bar_text_size => [
        %Q(),
        %Q(val.is_a?(Numeric) && val >= 0),
        %Q(16)
      ],
      :ecatb_bar_text_xy_offset => [
        %Q(),
        %Q(val.is_a?(Array) && val[0].is_a?(Numeric) && val[1].is_a?(Numeric)),
        %Q([-1, -1])
      ],
      :ecatb_bar_back_colors => [
        %Q(),
        %Q(val.is_a?(Array) && val[0].is_a?(Color) && val[1].is_a?(Color)),
        %Q([Colour.text_colour(15), Colour.text_colour(15)])
      ]
    }

    # Stores all configurations having methods in ECATB_Clock_Bar
    # General form: :config => [
    #                 %Q(arguments),
    #                 %Q(validation check),
    #                 %Q(default value)
    #               ]
    ECATB_CLOCK_BAR = {
      :ecatb_clock_bar_colors => [
        %Q(),
        %Q(val.is_a?(Array) && val[0].is_a?(Color) && val[1].is_a?(Color)),
        %Q([Colour.text_colour(7), Colour.text_colour(8)])
      ],
      :ecatb_clock_bar_wh => [
        %Q(),
        %Q(val.is_a?(Array) && val[0].is_a?(Numeric) && val[0] >= 0 && 
           val[1].is_a?(Numeric) && val[1] >= 0),
        %Q([112, 12])
      ],
      :ecatb_clock_bar_xy => [
        %Q(),
        %Q(val.is_a?(Array) && val[0].is_a?(Numeric) && val[1].is_a?(Numeric)),
        %Q([8, 8])
      ]
    }

    # Stores all configurations having methods in Window_BattleStatus
    # General form: :config => [
    #                 %Q(arguments),
    #                 %Q(validation check),
    #                 %Q(default value)
    #               ]
    WINDOW_BATTLESTATUS = {
      :actor_ecatb_bar_text => [
        %Q((percent, act)),
        %Q(val.is_a?(String)),
        %Q(percent + "% " + act)
      ],
      :actor_ecatb_bar_word => [
        %Q(),
        %Q(val.is_a?(String)),
        %Q("AP")
      ],
      :actor_ecatb_bar_y_add => [
        %Q(),
        %Q(val.is_a?(Numeric)),
        %Q(12)
      ]
    }

    # Stores all configurations having methods in ECATB_Clock_Window
    # General form: :config => [
    #                 %Q(arguments),
    #                 %Q(validation check),
    #                 %Q(default value)
    #               ]
    ECATB_CLOCK_WINDOW = {
      :ecatb_clock_window_wh => [
        %Q(),
        %Q(val.is_a?(Array) && val[0].is_a?(Numeric) && val[0] >= 0 && 
           val[1].is_a?(Numeric) && val[1] >= 0),
        %Q([128, 48])
      ],
      :ecatb_clock_window_xyz => [
        %Q(),
        %Q(val.is_a?(Array) && 
           val.all?(&DoubleX_RMVXA::ECATB::BLOCKS[:check_us_num])),
        %Q([0, 0, 0])
      ],
      :ecatb_clock_text => [
        %Q((cur_clock, max_clock, turn_count)),
        %Q(val.is_a?(String)),
        %Q(cur_clock.to_s + "/" + max_clock.to_s + " " + turn_count.to_s)
      ],
      :ecatb_clock_text_color => [
        %Q(),
        %Q(val.is_a?(Color)),
        %Q(Colour.text_colour(0))
      ],
      :ecatb_clock_text_size => [
        %Q(),
        %Q(val.is_a?(Numeric) && val >= 0),
        %Q(16)
      ],
      :ecatb_clock_text_xy => [
        %Q(),
        %Q(val.is_a?(Array) && val[0].is_a?(Numeric) && val[1].is_a?(Numeric)),
        %Q([0, 4])
      ]
    }

    # Stores all configurations having methods in ECATB_Force_Window
    # General form: :config => [
    #                 %Q(arguments),
    #                 %Q(validation check),
    #                 %Q(default value)
    #               ]
    ECATB_FORCE_WINDOW = {
      :ecatb_force_window_wh => [
        %Q(),
        %Q(val.is_a?(Array) && val[0].is_a?(Numeric) && val[0] >= 0 && 
           val[1].is_a?(Numeric) && val[1] >= 0),
        %Q([128, 40])
      ],
      :ecatb_force_window_xyz => [
        %Q(),
        %Q(val.is_a?(Array) && 
           val.all?(&DoubleX_RMVXA::ECATB::BLOCKS[:check_us_num])),
        %Q([0, 48, 0])
      ],
      :ecatb_force_nil_text => [
        %Q(),
        %Q(val.is_a?(String)),
        %Q("No Force ATB")
      ],
      :ecatb_force_run_text => [
        %Q(),
        %Q(val.is_a?(String)),
        %Q("ATB Force Run")
      ],
      :ecatb_force_stop_text => [
        %Q(),
        %Q(val.is_a?(String)),
        %Q("ATB Force Stop")
      ],
      :ecatb_force_text_color => [
        %Q(),
        %Q(val.is_a?(Color)),
        %Q(Colour.text_colour(0))
      ],
      :ecatb_force_text_size => [
        %Q(),
        %Q(val.is_a?(Numeric) && val >= 0),
        %Q(16)
      ],
      :ecatb_force_text_xy => [
        %Q(),
        %Q(val.is_a?(Array) && val[0].is_a?(Numeric) && val[1].is_a?(Numeric)),
        %Q([0, 0])
      ]
    }

    # (v0.01a+)Stores all configurations having methods in ECATB_Order_Window
    # General form: :config => [
    #                 %Q(arguments),
    #                 %Q(validation check),
    #                 %Q(default value)
    #               ]
    ECATB_ORDER_WINDOW = {
      :ecatb_order_window_wh => [
        %Q(),
        %Q(val.is_a?(Array) && val[0].is_a?(Numeric) && val[0] >= 0 && 
           val[1].is_a?(Numeric) && val[1] >= 0),
        %Q([128, 60])
      ],
      :ecatb_order_window_xyz => [
        %Q(),
        %Q(val.is_a?(Array) && 
           val.all?(&DoubleX_RMVXA::ECATB::BLOCKS[:check_us_num])),
        %Q([0, 88, 0])
      ],
      :ecatb_order_bar_colors => [
        %Q(),
        %Q(val.is_a?(Array) && val[0].is_a?(Color) && val[1].is_a?(Color)),
        %Q([Colour.text_colour(7), Colour.text_colour(8)])
      ],
      :ecatb_order_charge_bar_colors => [
        %Q(),
        %Q(val.is_a?(Array) && val[0].is_a?(Color) && val[1].is_a?(Color)),
        %Q([Colour.text_colour(30), Colour.text_colour(31)])
      ],
      :ecatb_order_cooldown_bar_colors => [
        %Q(),
        %Q(val.is_a?(Array) && val[0].is_a?(Color) && val[1].is_a?(Color)),
        %Q([Colour.text_colour(19), Colour.text_colour(26)])
      ],
      :ecatb_order_bar_wh => [
        %Q(),
        %Q(val.is_a?(Array) && val[0].is_a?(Numeric) && val[0] >= 0 && 
           val[1].is_a?(Numeric) && val[1] >= 0),
        %Q([108, 12])
      ],
      :ecatb_order_bar_xy => [
        %Q(),
        %Q(val.is_a?(Array) && val[0].is_a?(Numeric) && val[1].is_a?(Numeric)),
        %Q([0, 12])
      ],
      :ecatb_order_bar_text => [
        %Q(),
        %Q(val.is_a?(String)),
        %Q("ATB")
      ],
      :ecatb_order_charge_bar_text => [
        %Q(),
        %Q(val.is_a?(String)),
        %Q("Charge")
      ],
      :ecatb_order_cooldown_bar_text => [
        %Q(),
        %Q(val.is_a?(String)),
        %Q("Cool")
      ],
      :ecatb_order_text_color => [
        %Q(),
        %Q(val.is_a?(Color) || val.is_a?(Color)),
        %Q(Colour.text_colour(0))
      ],
      :ecatb_order_text_size => [
        %Q(),
        %Q(val.is_a?(Numeric) && val >= 0),
        %Q(12)
      ],
      :ecatb_order_text_xy => [
        %Q(),
        %Q(val.is_a?(Array) && val[0].is_a?(Numeric) && val[1].is_a?(Numeric)),
        %Q([2, 14])
      ]
    }

    # Stores all configurations having methods in ECATB_Pool_Window
    # General form: :config => [
    #                 %Q(arguments),
    #                 %Q(validation check),
    #                 %Q(default value)
    #               ]
    ECATB_POOL_WINDOW = {
      :ecatb_pool_window_wh => [
        %Q(),
        %Q(val.is_a?(Array) && val[0].is_a?(Numeric) && val[0] >= 0 && 
           val[1].is_a?(Numeric) && val[1] >= 0),
        %Q([128, 56])
      ],
      :ecatb_pool_window_xyz => [
        %Q(),
        %Q(val.is_a?(Array) && 
           val.all?(&DoubleX_RMVXA::ECATB::BLOCKS[:check_us_num])),
        %Q([0, 148, 0])
      ],
      :ecatb_pool_party_actor_text => [
        %Q(),
        %Q(val.is_a?(Array) && val[0].is_a?(String) && val[1].is_a?(String)),
        %Q(["Party ATB", "Actor ATB"])
      ],
      :ecatb_pool_troop_enemy_text => [
        %Q(),
        %Q(val.is_a?(Array) && val[0].is_a?(String) && val[1].is_a?(String)),
        %Q(["Troop ATB", "Enemy ATB"])
      ],
      :ecatb_pool_text_color => [
        %Q(),
        %Q(val.is_a?(Color)),
        %Q(Colour.text_colour(0))
      ],
      :ecatb_pool_text_size => [
        %Q(),
        %Q(val.is_a?(Numeric) && val >= 0),
        %Q(16)
      ],
      :ecatb_pool_party_text_xy => [
        %Q(),
        %Q(val.is_a?(Array) && val[0].is_a?(Numeric) && val[1].is_a?(Numeric)),
        %Q([0, 8])
      ],
      :ecatb_pool_troop_text_xy => [
        %Q(),
        %Q(val.is_a?(Array) && val[0].is_a?(Numeric) && val[1].is_a?(Numeric)),
        %Q([0, -8])
      ]
    }

    # Stores all configurations having methods in Scene_Battle
    # General form: :config => [
    #                 %Q(arguments),
    #                 %Q(validation check),
    #                 %Q(default value)
    #               ]
    SCENE_BATTLE = {
      :ecatb_wait_cond => [
        %Q(),
        %Q(true),
        %Q(#{WC1} || #{WC2} && (#{WC3} || #{WC4} || #{WC5} || #{WC6} || 
           #{WC7} || #{WC8} || #{WC9} || #{WC10} || #{WCC1}))
      ],
      :ecatb_turn_type => [
        %Q(),
        %Q(val == :tick || val == :act || val == :battler),
        %Q(:tick)
      ],
      :ecatb_tick_count => [
        %Q(),
        %Q(val.is_a?(Numeric) && val >= 0),
        %Q(10)
      ],
      :ecatb_after_act => [
        %Q(),
        %Q(val.is_a?(Numeric) && val >= 0),
        %Q(10)
      ],
      :ecatb_battler_scale => [
        %Q(),
        %Q(val.is_a?(Array) && val[0].is_a?(Numeric) && val[0] >= 0 && 
           (val[1] == :tick || val[1] == :act)),
        %Q([1, :tick])
      ],
      :ecatb_battler_count => [
        %Q(),
        %Q(val.is_a?(Numeric) && val >= 0),
        %Q($game_party.alive_members.size + $game_troop.alive_members.size)
      ],
      :ecatb_force_act_count => [
        %Q(),
        %Q(true),
        %Q(false)
      ],
      :pre_ecatb_update => [
        %Q(),
        %Q(true),
        %Q()
      ],
      :post_ecatb_update => [
        %Q(),
        %Q(true),
        %Q()
      ],
      :ecatb_cancel_key => [
        %Q(),
        %Q(val.is_a?(Symbol)),
        %Q(:SHIFT)
      ],
      :ecatb_cancel_text=> [
        %Q(),
        %Q(val.is_a?(String)),
        %Q("Select an actor without autobattle norconfusion to\ncancel " +
           "his/her/its partially charging skill/item.")
      ],
      :ecatb_force_run_key => [
        %Q(),
        %Q(val.is_a?(Symbol)),
        %Q(:CTRL)
      ],
      :ecatb_force_stop_key => [
        %Q(),
        %Q(val.is_a?(Symbol)),
        %Q(:ALT)
      ],
      :ecatb_battler_hotkeys => [
        %Q(),
        %Q(val.is_a?(Array) && 
           val.all?(&DoubleX_RMVXA::ECATB::BLOCKS[:check_sym])),
        %Q([:NUMPAD1, :NUMPAD2, :NUMPAD3, :NUMPAD4, :NUMPAD5, :NUMPAD6,
            :NUMPAD7, :NUMPAD8, :NUMPAD9, :NUMPAD0])
      ]
    }

    # Stores all iterator blocks
    # General form: :def_name => iterator_block
    BLOCKS = {
      :check_game_battler => -> v { v.is_a?(Game_Battler) },
      :check_ord => -> v { v == :states || v == :enemies || v == :armors || 
                           v == :weapons || v == :classes || v == :actors },
      :check_sym => -> v { v.is_a?(Symbol) },
      :check_us_num => -> v { v.is_a?(Numeric) && v >= 0 },
      :close_ecatb_windows => -> window { window.hide.deactivate.close },
      :clear_ecatb_blocks => -> mem { mem.clear_ecatb_blocks },
      :create_ecatb_defs => -> mem { mem.create_ecatb_defs },
      :dispose => -> obj { obj.dispose if obj && !obj.disposed? },
      :ecatb_ctb_break? => -> b { b.actor? && b.ecatb_inputable? || 
                                  b.exec_ecatb_act? },
      :ecatb_reset => -> mem { mem.ecatb_reset },
      :ecatb_input_list_1 => -> actor { actor.ecatb_inputable? },
      :ecatb_input_list_2 => -> actor { actor.index },
      :ecatb_on_turn_end => -> mem { mem.on_turn_end },
      :ecatb_refresh => -> battler { battler.ecatb_refresh },
      :ecatb_update_windows => -> w { w.hide.deactivate.close if w.active },
      :ecatb_updates => -> mem { mem.ecatb_updates },
      :init_ecatb_escape => -> mem { mem.init_ecatb_escape },
      :load_ecatb_notes => -> d { d.each(&BLOCKS[:load_ecatb_notes_each]) },
      :load_ecatb_notes_each => -> obj { obj.load_ecatb_notes if obj },
      :pay_ecatb_act_cost => -> actor { actor.pay_ecatb_act_cost },
      :pay_ecatb_esc_cost => -> mem { mem.pay_ecatb_esc_cost if mem.ecatb_esc },
      :refresh_ecatb_windows => ->  window { window.refresh if window.active },
      :reset_ecatb_blocks => -> mem { mem.reset_ecatb_blocks },
      :reset_ecatb_refresh => -> battler { battler.ecatb_refresh = false },
      :sort_screen_x => -> a, b { a.screen_x - b.screen_x },
      :update => -> obj { obj.update },
      :update_ecatb_pool => -> unit {
        next unless unit.ecatb_pool
        if (members = unit.alive_members).any?(&BLOCKS[:update_ecatb_pool_any])
          val = members.collect(&BLOCKS[:update_ecatb_pool_collect])
          max = val.max
          size = val.size
          val = unit.ecatb_pool_val(val)
          val = max if max - val <= Float::EPSILON * size * max
          members.each { |mem|
            mem.ecatb_val[:atb] = val
            mem.ecatb_val_change = false
          }
        end
        next unless members.all?(&BLOCKS[:update_ecatb_pool_all])
        act = 0
        members.each { |mem|
          next if mem.ecatb_act_times_cap
          mem.ecatb_act_times_cap = false
          act += mem.ecatb_act_times_add
          mem.ecatb_act_times -= mem.ecatb_act_times_add
          mem.ecatb_act_times_add = 0
        }
        members.each { |mem| mem.ecatb_act_times += act } if act > 0
      },
      :update_ecatb_pool_any => -> mem { mem.ecatb_val_change },
      :update_ecatb_pool_collect => -> mem { mem.ecatb_val[:atb] },
      :update_ecatb_pool_all => -> mem { mem.ecatb_act_times_add > 0 },
      :update_ecatb_unison => -> mem {
        next unless mem.ecatb_unison_invoker
        actors = mem.ecatb_unison_actors
        if actors.any?(&BLOCKS[:update_ecatb_unison_any_1])
          type = :charge
        elsif actors.any?(&BLOCKS[:update_ecatb_unison_any_2])
          actors &= $game_party.alive_members
          type = :cooldown
        else
          next
        end
        val = actors.collect { |actor| actor.ecatb_val[type] }
        val = mem.ecatb_unison_rules(val, mem.ecatb_unison_rule[type])
        actors.each { |actor| actor.ecatb_val[type] = val }
      },
      :update_ecatb_unison_any_1 => -> actor { actor.ecatb_val[:charge] > 0.0 },
      :update_ecatb_unison_any_2 => -> a { a.ecatb_val[:cooldown] > 0.0 },
      :usable? => -> actor_id { $game_actors[actor_id] },
      :window_battleenemy_update => -> m { m.sprite_effect_type = :whiten }
    }

    # Stores all regular expressions of the non-usableitem notetags
    REGEX = [
      /< *ecatb +color *: *(\w+) *, *(\d+) *, *(\w+) *>/i,
      /< *ecatb +gradual +action +gain *: *(\w+) *>/i,
      /< *ecatb +order +battler +icon *: *(\w+) *>/i,
      /< *ecatb +order +battler +opacity *: *(\w+) *>/i,
      /< *ecatb +order +battler +scale *: *(\w+) *>/i,
      /< *ecatb +order +battler +z *: *(\w+) *>/i,
      /< *ecatb +rate *: *(\w+) *>/i,
      /< *ecatb +se +ready +act *: *(\w+) *>/i,
      /< *ecatb +speed +reduce *: *(\w+) *>/i,
      /< *ecatb +start +val *: *(\d+) *, *(\w+) *>/i,
      /< *enemy +ecatb +bar +show *: *(\w+) *, *(\w+) *, *(\w+) *, *(\w+) *>/i,
      /< *ecatb +countdown +interval *: *(\w+) *>/i,
      /< *ecatb +act +cost *: *(\w+) *>/i,
      /< *ecatb +charge +prior +act +cost *: *(\w+) *>/i,
      /< *ecatb +charge +prior +item +cost *: *(\w+) *>/i, 
      /< *ecatb +charge +rate *: *(\w+) *>/i,
      /< *ecatb +cooldown +rate *: *(\w+) *>/i,
      /< *ecatb +force +act +cost *: *(\w+) *>/i,
      /< *ecatb +reset +val *: *(\w+) *>/i,
      /< *ecatb +unison +actor *: *(\w+) *>/i,
      /< *ecatb +unison +charge +rule *: *(\w+) *>/i,
      /< *ecatb +unison +cooldown +rule *: *(\w+) *>/i,
      /< *ecatb +unison +actor +(\w+) *: *(\w+) *>/i,
      /< *ecatb +unison +(\w+) +rule *: *(\w+) *>/
    ]

    # Stores all regular expressions of the usableitem notetags
    USABLEITEM_NOTES = [
      "ecatb_act_cost",
      "ecatb_charge_prior_act_cost",
      "ecatb_charge_prior_item_cost",
      "ecatb_charge_rate",
      "ecatb_cooldown_rate",
      "ecatb_force_act_cost",
      "ecatb_reset_val",
      "ecatb_unison_actor",
      "ecatb_unison_charge_rule",
      "ecatb_unison_cooldown_rule",
      "ecatb_unison_actor_def",
      "ecatb_unison_def_rule"
    ]

    #Stores all pieces of codes used for reading notetags in all database parts
    NOTE_START = %Q(
  attr_reader :ecatb_notes
  def load_ecatb_notes
    @ecatb_notes = {}
    ecatb = DoubleX_RMVXA::ECATB
    )
    NOTE_MID = %Q(
    [:atb, :charge, :cooldown, :rate, :speed, :start_0, :start_1, :start_2].
    each { |note| @ecatb_notes[note] = [] }
    @note.split(/[\r\n]+/).each { |line|
      if line =~ ecatb::REGEX[0]
        next @ecatb_notes[$1.downcase.to_sym][$2.to_i] ||= $3.downcase.to_sym
      elsif line =~ ecatb::REGEX[1]
        next @ecatb_notes[:act] = $1.downcase.to_sym
      elsif line =~ ecatb::REGEX[2]
        next @ecatb_notes[:order_icon] = $1.downcase.to_sym
      elsif line =~ ecatb::REGEX[3]
        next @ecatb_notes[:order_opacity] = $1.downcase.to_sym
      elsif line =~ ecatb::REGEX[4]
        next @ecatb_notes[:order_scale] = $1.downcase.to_sym
      elsif line =~ ecatb::REGEX[5]
        next @ecatb_notes[:order_z] = $1.downcase.to_sym
      elsif line =~ ecatb::REGEX[6]
        next @ecatb_notes[:rate] << $1.downcase.to_sym
      elsif line =~ ecatb::REGEX[7]
        next @ecatb_notes[:se] = $1.downcase.to_sym
      elsif line =~ ecatb::REGEX[8]
        next @ecatb_notes[:speed] << $1.downcase.to_sym
      elsif line =~ ecatb::REGEX[9]
        next @ecatb_notes[("start_" + $1).to_sym] << $2.downcase.to_sym
    )
    NOTE_QUARTER = %Q(
      end
    }
    )
    NOTE_END = %Q(
  end
    )
    BAR_NOTE_START = %Q(
  attr_accessor :enemy_ecatb_bar_show
    )
    BAR_NOTE_MID = %Q(
    @enemy_ecatb_bar_show = [
      eval(ecatb::BAR_KILL_ENEMY_1ST),
      eval(ecatb::ENEMY_BAR_SHOW),
      eval(ecatb::ENEMY_BAR_SHOW_PERCENT),
      eval(ecatb::ENEMY_BAR_SHOW_ACT),
    ]
    )
    BAR_NOTE_END = %Q(
      elsif line =~ ecatb::REGEX[10]
        next @enemy_ecatb_bar_show = [eval($1.downcase), eval($2.downcase), 
        eval($3.downcase), eval($4.downcase)]
    )
    COUNTDOWN_NOTE_START = %Q(
  attr_accessor :ecatb_countdown_interval
    )
    COUNTDOWN_NOTE_MID = %Q(
      elsif line =~ ecatb::REGEX[11]
        next @ecatb_countdown_interval = $1.downcase.to_sym
    )
    COUNTDOWN_NOTE_END = %Q(
    @auto_removal_timing = 3 if @ecatb_countdown_interval
    )

    # Stores the method load_ecatb_notes in actors, classes and equips
    CLASS_NOTES = EQUIP_NOTES = ACTOR_NOTES = NOTE_START + NOTE_MID + 
    NOTE_QUARTER + NOTE_END

    # Stores the method load_ecatb_notes in enemies
    ENEMY_NOTES = BAR_NOTE_START + NOTE_START + %Q(
    t, f, n = true, false, nil
    ) + BAR_NOTE_MID + NOTE_MID + BAR_NOTE_END + NOTE_QUARTER + NOTE_END

    # Stores the method load_ecatb_notes in states
    STATE_NOTES = BAR_NOTE_START + COUNTDOWN_NOTE_START + NOTE_START + 
                  BAR_NOTE_MID + NOTE_MID + COUNTDOWN_NOTE_MID + BAR_NOTE_END + 
                  NOTE_QUARTER + COUNTDOWN_NOTE_END + NOTE_END

    # Stores the abstract method creator and validator for all configurations
    CHECK_RESET_DEF = {}
    [:BATTLEMANAGER, :GAME_ACTOR, :GAME_ENEMY, :GAME_PARTY_TROOP, 
     :WINDOW_BATTLESTATUS, :ECATB_CLOCK_WINDOW, :ECATB_BAR, :ECATB_CLOCK_BAR, 
     :ECATB_FORCE_WINDOW, :ECATB_ORDER_WINDOW, :ECATB_POOL_WINDOW, 
     :SCENE_BATTLE].each { |key|
      CHECK_RESET_DEF[key] = %Q(
  def create_ecatb_defs
    DoubleX_RMVXA::ECATB::#{key.id2name}.each_key { |config|
      create_ecatb_def(config) unless respond_to?(config)
    }
  end

  def check_ecatb_def(config, check)
    percent = act = ""
    charge = cooldown = cur_clock = max_clock = turn_count = rule = -1
    vals = []
    #{RESCUE_CONFIG_VAL ? "begin" : ""}
    val = eval(config + check[0])
    reset_ecatb_def(config, check, "is invalid.") unless eval(check[1])
    #{RESCUE_CONFIG_VAL ? %Q(rescue Exception => error
    msgbox("This error message's raised:\n" + error.message)
    reset_ecatb_def(config, check, "could crash the game.")
    end) : ""}
  end

  def reset_ecatb_def(config, check, type)
    #{RESET_CONFIG_VAL ? "" : "return"}
    #{SUPPRESS_RESET_CONFIG_VAL_TEXT ? "" : %Q(msgbox("The validation code " + 
    "of " + config + " is\n" + check[1])
    msgbox("The value of " + 
    config + " is\n" + $game_system.send(config.to_sym) + "\nwhich " + type))}
    $game_system.send((config + "=").to_sym, check[2])
    create_ecatb_def(config.to_sym, false)
    #{SUPPRESS_RESET_CONFIG_VAL_TEXT ? "" : %Q(msgbox(
    "Its value is reset to its default:\n" + check[2]))}
  end
      )
    }

    # (v0.02c+)Returns the atb charge gain and cooldown loss rate
    CHARGE_COOLDOWN_RATE = {}
    [:charge, :cooldown].each { |key|
      CHARGE_COOLDOWN_RATE[key] = %Q(
  def ecatb_#{type = key.id2name}_#{key == :charge ? "gain" : "loss"}_rate
    return @ecatb_rate[:#{type}] unless (@last_ecatb_rate[:#{type}] != 
    @last_ecatb_rate[:#{type}] = ecatb_gain_rate) || 
    @ecatb_item_change[:#{type}]
    @ecatb_item_change[:#{type}] = false
    @ecatb_rate[:#{type}] = if @#{key == :charge ? "" : "fail_"}ecatb_esc
      esc_ecatb_#{type}_rate(@last_ecatb_rate[:#{type}])
    else
      DoubleX_RMVXA::ECATB.send(@last_ecatb_item.ecatb_#{type}_rate, self, 
      @last_ecatb_rate[:#{type}])
    end
  end
      )
    }

    # (v0.01a+)Reads all atb order battler icon, opacity, scale and z notetags
    ORDER = {}
    [:icon, :opacity, :scale, :z].each { |key|
      type = key.id2name
      ORDER[key] = %Q(
  def set_ecatb_order_battler_#{type}
    unless ecatb_battler_change?(:order_#{type})
      return @ecatb_notes[:order_#{type}]
    end
    @ecatb_notes[:order_#{type}] = nil
    ecatb_order_battler_#{type}_ord.each { |data|
      if send(@ecatb_item[data][0])
        set_ecatb_notes(send(@ecatb_item[data][1]), :order_#{type})
      end
      return @ecatb_notes[:order_#{type}] if @ecatb_notes[:order_#{type}]
    }
    @ecatb_notes[:order_#{type}] = ecatb_order_battler_#{type}
  end
      )
    }

    # Processes actor hotkeys used by Window_ActorCommand and Window_BattleActor
    ACTOR_HOTKEY = %Q(
  alias process_handling_ecatb process_handling
  def process_handling
    if BattleManager.btype?(:ecatb) && open? && active
      SceneManager.scene.ecatb_battler_hotkeys.each(&@ecatb_hotkey_block)
    end
    process_handling_ecatb
  end # process_handling
    )

    # Updates the positions, width and height and text font update methods
    WINDOW_DEFS = {}
    [:clock, :force, :order, :pool].each { |key|
      klass = key.id2name
      WINDOW_DEFS[key] = %Q(
  def update_pos
    xyz = ecatb_#{klass}_window_xyz
    self.x = xyz[0] if x != xyz[0]
    self.y = xyz[1] if y != xyz[1]
    self.z = xyz[2] if z != xyz[2]
  end

  def update_wh
    wh = ecatb_#{klass}_window_wh
    self.width = wh[0] if width != wh[0]
    self.height = wh[1] if height != wh[1]
  end

  def update_text_font
    if (font = contents.font).color != color = ecatb_#{klass}_text_color
      font.color = color
    end
    return if font.size == size = ecatb_#{klass}_text_size
    font.size = size
  end
      )
    }

    # (v0.04d+)Processes the skill/item target cancellation command
    ON_TARGET_CANCEL = {}
    [:actor, :enemy].each { |key|
      ON_TARGET_CANCEL[key] = %Q(
  alias on_#{key = key.id2name}_cancel_ecatb on_#{key}_cancel
  def on_#{key}_cancel(*argv, &argb)
    return unless actor = BattleManager.actor
    if BattleManager.btype?(:ecatb) && on_ecatb_unison?(:cancel, @#{key}_window)
      return
    end
    on_#{key}_cancel_ecatb(*argv, &argb)
    @status_window.draw_item(actor.index)
  end
      )
    }

    # (v0.04d+)Processes the skill/item selection confirmation command
    ON_SKILL_ITEM_OK = {}
    [:skill, :item].each { |key|
      ON_SKILL_ITEM_OK[key] = %Q(
  alias on_#{key = key.id2name}_ok_ecatb on_#{key}_ok
  def on_#{key}_ok(*argv, &argb)
    return unless actor = BattleManager.actor
    return if on_ecatb_unison_item_ok?(@#{key}_window)
    on_#{key}_ok_ecatb(*argv, &argb)
    @status_window.draw_item(actor.index)
  end
      )
    }

    # (v0.01b+)Creates the atb force, order and pool windows
    CREATE_WINDOW = {}
    [:Force, :Order, :Pool].each { |key|
      name1 = key.id2name
      CREATE_WINDOW[key] = %Q(
  def create_ecatb_#{name2 = name1.downcase}_window
    return if @ecatb_#{name2}_window
    return unless eval($game_system.show_ecatb_#{name2}_window)
    @ecatb_#{name2}_window = 
    ECATB_#{name1}_Window.new#{key == :Force ? "(@ecatb_force_clock)" : ""}
  end
      )
    }

    # (v0.01b+)Closes the atb clock, force, order and pool windows
    CLOSE_WINDOW = {}
    [:clock, :force, :order, :pool].each { |key|
      CLOSE_WINDOW[key] = %Q(
  def close_ecatb_#{name = key.id2name}_window
    @ecatb_#{name}_window.hide.deactivate.close
    @ecatb_#{name}_window.dispose unless @ecatb_#{name}_window.disposed?
    @ecatb_#{name}_window = nil
  end
      )
    }

  end # ECATB

end # DoubleX_RMVXA

if $imported["YEA-BattleEngine"] && !$imported["YSA-CATB"]

#------------------------------------------------------------------------------|

#------------------------------------------------------------------------------|
#  * Load all data's notetags and fixes bugs and edge cases                    |
#------------------------------------------------------------------------------|
class << DataManager # Edit

  #----------------------------------------------------------------------------|
  #  Loads all this script's notetags from the database as well                |
  #----------------------------------------------------------------------------|
  alias load_database_ecatb load_database
  def load_database(*argv, &argb)
    load_database_ecatb(*argv, &argb)
    load_ecatb_notes # Added
  end # load_database

  #----------------------------------------------------------------------------|
  #  Clears and resets all battlers' blocks before and after saving also       |
  #----------------------------------------------------------------------------|
  alias save_game_without_rescue_ecatb save_game_without_rescue
  def save_game_without_rescue(index, &argb)
    clear_ecatb_blocks # Added
    save_game_without_rescue_ecatb(index, &argb)
    init_ecatb_def_blocks # Added
  end # save_game_without_rescue

  #----------------------------------------------------------------------------|
  #  Resets all battlers' blocks and methods after loading as well             |
  #----------------------------------------------------------------------------|
  alias extract_save_contents_ecatb extract_save_contents
  def extract_save_contents(contents, &argb)
    extract_save_contents_ecatb(contents, &argb)
    init_ecatb_def_blocks(true) # Added
  end # extract_save_contents

  def load_ecatb_notes # New
    [$data_actors, $data_classes, $data_skills, $data_items, $data_weapons,
     $data_armors, $data_enemies, $data_states].each(
     &DoubleX_RMVXA::ECATB::BLOCKS[:load_ecatb_notes])
  end # load_ecatb_notes

  #----------------------------------------------------------------------------|
  #  Clears all blocks before serializations and after being unneeded          |
  #----------------------------------------------------------------------------|
  def clear_ecatb_blocks # New
    block = DoubleX_RMVXA::ECATB::BLOCKS[:clear_ecatb_blocks]
    $game_actors.instance_exec { @data.compact.each(&block) }
    $game_troop.members.each(&block)
  end # clear_ecatb_blocks

  #----------------------------------------------------------------------------|
  #  Resets all blocks after serializations and being needed                   |
  #----------------------------------------------------------------------------|
  def init_ecatb_def_blocks(create_def = false) # New
    block = DoubleX_RMVXA::ECATB::BLOCKS
    $game_party.all_members.each(&block[:create_ecatb_defs]) if create_def
    $game_party.all_members.each(&block[:reset_ecatb_blocks])
    $game_troop.members.each(&block[:reset_ecatb_blocks])
  end # init_ecatb_def_blocks

end # DataManager

#------------------------------------------------------------------------------|
#  * Loads all the actor's notetags                                            |
#------------------------------------------------------------------------------|
class RPG::Actor < RPG::BaseItem # Edit

  module_eval(DoubleX_RMVXA::ECATB::ACTOR_NOTES) # New

end # RPG::Actor

#------------------------------------------------------------------------------|
#  * Loads all the class's notetags                                            |
#------------------------------------------------------------------------------|
class RPG::Class < RPG::BaseItem # Edit

  module_eval(DoubleX_RMVXA::ECATB::CLASS_NOTES) # New

end # RPG::Class

#------------------------------------------------------------------------------|
#  * Loads all the enemy's notetags                                            |
#------------------------------------------------------------------------------|
class RPG::Enemy < RPG::BaseItem # Edit

  module_eval(DoubleX_RMVXA::ECATB::ENEMY_NOTES) # New

end # RPG::Enemy

#------------------------------------------------------------------------------|
#  * Loads all the equip's notetags                                            |
#------------------------------------------------------------------------------|
class RPG::EquipItem < RPG::BaseItem # Edit

  module_eval(DoubleX_RMVXA::ECATB::EQUIP_NOTES) # New

end # RPG::EquipItem

#------------------------------------------------------------------------------|
#  * Loads all the state's notetags                                            |
#------------------------------------------------------------------------------|
class RPG::State < RPG::BaseItem # Edit

  module_eval(DoubleX_RMVXA::ECATB::STATE_NOTES) # New

end # RPG::State

class RPG::UsableItem < RPG::BaseItem # Edit

  #----------------------------------------------------------------------------|
  #  New public instance variables                                             |
  #----------------------------------------------------------------------------|
  # The values of all the skill/item's notetags
  DoubleX_RMVXA::ECATB::USABLEITEM_NOTES.each { |note|
    attr_accessor eval(":#{note}")
  }
  #

  def load_ecatb_notes # New
    @ecatb_unison_actor_def = {}
    @ecatb_unison_def_rule = {}
    ecatb = DoubleX_RMVXA::ECATB
    @note.split(/[\r\n]+/).each { |line|
      ecatb::USABLEITEM_NOTES.each_with_index { |note, index|
        next unless line =~ ecatb::REGEX[index + 12]
        if index > 9
          note += "[:#{$1}]"
          val = $2.downcase.to_sym
        else
          val = $1.downcase.to_sym
        end
        send(:"#{note}=", send(:"#{note}") || val)
      }
    }
    ecatb::USABLEITEM_NOTES.each_with_index { |note, index|
      send(:"#{note}=", send(:"#{note}") || note.to_sym) if index < 10
    }
  end # load_ecatb_notes

end # RPG::UsableItem

#------------------------------------------------------------------------------|
#  * Reimplements the the whole battle flow to run the atb system              |
#------------------------------------------------------------------------------|
class << BattleManager # Edit

  #----------------------------------------------------------------------------|
  #  New public instance variables                                             |
  #----------------------------------------------------------------------------|
  attr_accessor :actor_index # Accessed by Scene_Battle to setup actors
  attr_accessor :ecatb_can_esc # The party escape permission flag
  attr_reader :ecatb_actor_act_list # The list of actors that can act
  attr_reader :ecatb_base # The base atb rate determinators
  attr_reader :ecatb_base_change # The base atb rate determinators change flag
  attr_reader :action_battlers # Read by Scene_Battle to execute actions
  attr_reader :phase # Read by Scene_Battle to get the battle phase

  #----------------------------------------------------------------------------|
  #  New private instance variables                                            |
  #----------------------------------------------------------------------------|
  # @ecatb_battlers_def_sums: All method sums of all battlers
  # @ecatb_def_sums: The iteraotr block running all method sums of all battlers
  # @ecatb_esc: The party escape attempt flag
  # @ecatb_pool_reset_lock: The party/troop atb pool reset lock

  alias setup_ecatb setup
  def setup(troop_id, can_escape = true, can_lose = false, &argb)
    setup_ecatb(troop_id, can_escape, can_lose, &argb)
    # Added
    init_ecatb_vars
    create_ecatb_defs
    #
  end # setup

  #----------------------------------------------------------------------------|
  #  Always let actions to be executed at any frame for ecatb battle system    |
  #----------------------------------------------------------------------------|
  alias in_turn_ecatb? in_turn?
  def in_turn? # Hotspot
    btype?(:ecatb) || in_turn_ecatb? # Rewritten
  end # in_turn?

  #----------------------------------------------------------------------------|
  #  Disables the next command for ecatb battle system                         |
  #----------------------------------------------------------------------------|
  alias next_command_ecatb next_command
  def next_command(*argv, &argb)
    # Rewritten
    return false if btype?(:ecatb)
    next_command_ecatb(*argv, &argb)
    #
  end # next_command

  #----------------------------------------------------------------------------|
  #  Disables the prior command for ecatb battle system                        |
  #----------------------------------------------------------------------------|
  alias prior_command_ecatb prior_command
  def prior_command(*argv, &argb)
    # Rewritten
    return false if btype?(:ecatb)
    prior_command_ecatb(*argv, &argb)
    #
  end # prior_command

  #----------------------------------------------------------------------------|
  #  Initializes all battlers' starting atb values and their method sums also  |
  #----------------------------------------------------------------------------|
  alias battle_start_ecatb battle_start
  def battle_start(*argv, &argb)
    battle_start_ecatb(*argv, &argb)
    ecatb_battle_start if btype?(:ecatb) # Added
  end # battle_start

  #----------------------------------------------------------------------------|
  #  Closes all windows that should be closed before ending the battle as well |
  #----------------------------------------------------------------------------|
  alias process_victory_ecatb process_victory
  def process_victory(*argv, &argb)
    # Added
    if btype?(:ecatb) && SceneManager.scene_is?(Scene_Battle)
      SceneManager.scene.close_ecatb_windows
    end
    #
    process_victory_ecatb(*argv, &argb)
  end # process_victory

  #----------------------------------------------------------------------------|
  #  Checks if escape's allowed, no such attempt exists and the conditions' met|
  #----------------------------------------------------------------------------|
  alias process_escape_ecatb process_escape
  def process_escape(*argv, &argb)
    return process_escape_ecatb(*argv, &argb) unless btype?(:ecatb) # Rewritten
    # Added to initializes the escape attempt if all the requirements are met
    return false if @ecatb_esc
    init_ecatb_escape if @ecatb_can_esc && ecatb_esc_init_cond
    false
    #
  end # process_escape

  #----------------------------------------------------------------------------|
  #  Closes all windows that should be closed before ending the battle as well |
  #----------------------------------------------------------------------------|
  alias process_defeat_ecatb process_defeat
  def process_defeat(*argv, &argb)
    # Added
    if btype?(:ecatb) && SceneManager.scene_is?(Scene_Battle)
      SceneManager.scene.close_ecatb_windows
    end
    #
    process_defeat_ecatb(*argv, &argb)
  end # process_defeat

  #----------------------------------------------------------------------------|
  #  Stops making actions for any battler and unselecting any inputable actor  |
  #----------------------------------------------------------------------------|
  alias input_start_ecatb input_start
  def input_start(*argv, &argb)
    # Added
    if btype?(:ecatb)
      @phase = :input
      @surprise = false
    end
    #
    input_start_ecatb(*argv, &argb)
  end # input_start

  #----------------------------------------------------------------------------|
  #  Clears all temporarily stored battlers' blocks as well                    |
  #----------------------------------------------------------------------------|
  alias battle_end_ecatb battle_end # v0.03b+
  def battle_end(result, &argb)
    battle_end_ecatb(result, &argb)
    clear_ecatb_blocks # Added
  end # battle_end

  def init_ecatb_vars # New
    $game_temp.init_ecatb_vars
    @ecatb_actor_act_list = []
    @ecatb_base = { size: -1, sum: -1, val: -1 }
    @ecatb_battlers_def_sums = {}
    @ecatb_can_esc = true
    @ecatb_pool_reset_lock = []
    init_ecatb_block
  end # init_ecatb_vars

  #----------------------------------------------------------------------------|
  #  Initializes the new block to trade memory usage for time performance      |
  #----------------------------------------------------------------------------|
  def init_ecatb_block # New
    # Calls this block instead of an anonymous function per enumerable iteration
    @ecatb_def_sums = -> method {
      @ecatb_battlers_def_sums[method] = ecatb_def_sum_battlers.inject(0) { 
      |sum, battler| sum + battler.send(method) }
    }
    #
  end # init_ecatb_block

  #----------------------------------------------------------------------------|
  #  Clears all temporarily stored battlers' blocks and frees memory as well   |
  #----------------------------------------------------------------------------|
  def clear_ecatb_blocks # v0.05a+; New
    $game_temp.clear_ecatb_vars
    @action_battlers = @ecatb_actor_act_list = @ecatb_base = nil
    @ecatb_battlers_def_sums = @ecatb_def_sums = @ecatb_pool_reset_lock = nil
  end # clear_ecatb_blocks

  #----------------------------------------------------------------------------|
  #  Creates and checks the associated method for each configuration used here |
  #----------------------------------------------------------------------------|
  # config: The configuration requesting its associated method
  # validate: The configuration value validation flag
  def create_ecatb_def(config, validate = true) # New
    # Uses the name and value of configuration as its method's name and contents
    method = config.id2name
    eval(%Q(
  def #{method}#{DoubleX_RMVXA::ECATB::BATTLEMANAGER[config][0]}
    #{$game_system.send(config)}
  end
    ))
    #
    return unless validate
    check_ecatb_def(method, DoubleX_RMVXA::ECATB::BATTLEMANAGER[config])
  end # create_ecatb_def

  #----------------------------------------------------------------------------|
  #  Checks all new methods and resets them to the defaults if they're invalid |
  #----------------------------------------------------------------------------|
  module_eval(DoubleX_RMVXA::ECATB::CHECK_RESET_DEF[:BATTLEMANAGER]) # New

  #----------------------------------------------------------------------------|
  #  Initializes all battlers' starting atb values and their method sums       |
  #----------------------------------------------------------------------------|
  def ecatb_battle_start # New
    type = @preemptive ? :start_1 : @surprise ? :start_2 : :start_0
    $game_party.battle_members.each { |mem| mem.set_ecatb_start_val(type) }
    $game_troop.members.each { |mem| mem.set_ecatb_start_val(type) }
    ecatb_battlers_def_sum.each(&@ecatb_def_sums)
  end # ecatb_battle_start

  #----------------------------------------------------------------------------|
  #  Updates all battlers' atb values and the party escape attempt status      |
  #----------------------------------------------------------------------------|
  def ecatb_update # New; Hotspot
    update_ecatb_base
    ecatb_block_update
    if update_ecatb_battlers_def_sums
      ecatb_battlers_def_sum.each(&@ecatb_def_sums)
    end
    return unless @ecatb_esc
    return pay_ecatb_esc_cost unless ecatb_esc_charge_cond
    ecatb_esc_suc if ecatb_esc_exec_cond
  end # ecatb_update

  def ecatb_block_update # v0.05a+; New; Hotspot
    block = DoubleX_RMVXA::ECATB::BLOCKS
    $game_party.battle_members.each(&block[:ecatb_updates])
    $game_troop.alive_members.each(&block[:ecatb_updates])
    [$game_party, $game_troop].each(&block[:update_ecatb_pool])
    $game_party.alive_members.each(&block[:update_ecatb_unison])
    $game_troop.alive_members.each(&block[:reset_ecatb_refresh])
  end # ecatb_block_update

  #----------------------------------------------------------------------------|
  #  Checks if the atb rate needs to be reevaluated                            |
  #----------------------------------------------------------------------------|
  def update_ecatb_base # New; Hotspot
    # Checks if the number of battlers, methods sums or the fill time's changed
    @ecatb_base_change = false
    base = {
      size: ecatb_def_sum_battlers.size,
      sum: @ecatb_battlers_def_sums,
      val: 100.0 / ecatb_base_fill_t / Graphics.frame_rate
    }
    base.each { |key, val|
      @ecatb_base_change = @ecatb_base[key] = val if @ecatb_base[key] != val
    }
    #
  end # update_ecatb_base

  #----------------------------------------------------------------------------|
  #  Initializes a party escape attempt                                        |
  #----------------------------------------------------------------------------|
  def init_ecatb_escape # New
    $game_message.add(sprintf(Vocab::EscapeStart, $game_party.name))
    @ecatb_esc = true
    # Resets all party members' charge rate and clears all unison data as well
    $game_party.battle_members.each(
    &DoubleX_RMVXA::ECATB::BLOCKS[:init_ecatb_escape])
    #
  end # init_ecatb_escape

  #----------------------------------------------------------------------------|
  #  Executes the fully charged party escape attempt                           |
  #----------------------------------------------------------------------------|
  def ecatb_esc_suc # New
    Sound.play_escape
    ecatb_esc_suc_cond ? process_abort : pay_ecatb_esc_cost
    wait_for_message
  end # ecatb_esc_suc

  #----------------------------------------------------------------------------|
  #  Asks all party members to pay the failed party escape attempt's costs     |
  #----------------------------------------------------------------------------|
  def pay_ecatb_esc_cost # New
    @escape_ratio += set_ecatb_esc_cost_compatibility
    $game_message.add('\.' + Vocab::EscapeFailure)
    block = DoubleX_RMVXA::ECATB::BLOCKS
    $game_party.battle_members.each(&block[:pay_ecatb_esc_cost])
    @ecatb_esc = false
    $game_party.alive_members.each(&block[:ecatb_reset])
  end # pay_ecatb_escape_cost

  #----------------------------------------------------------------------------|
  #  Triggers all battlers' turn end effects and collapses all collapsible ones|
  #----------------------------------------------------------------------------|
  def ecatb_on_turn_end # New
    $game_party.alive_members.each(
    &DoubleX_RMVXA::ECATB::BLOCKS[:ecatb_on_turn_end])
    esc_phase = @ecatb_can_esc || @phase
    $game_troop.alive_members.each { |m|
      m.on_turn_end
      m.perform_collapse_effect if esc_phase && m.enemy? && m.can_collapse?
    }
  end # ecatb_on_turn_end

  #----------------------------------------------------------------------------|
  #  Marks a battler to become able to act and plays that battler's ready se   |
  #----------------------------------------------------------------------------|
  def make_ecatb_act(battler) # New
    # Stores that battler in the actable battler list and actor list for actors
    return if @action_battlers.include?(battler)
    @action_battlers << battler
    @ecatb_actor_act_list << battler if battler.actor?
    battler.make_actions
    battler.pre_ecatb_input_act
    return unless (se = battler.set_ecatb_se_ready_act).is_a?(RPG::SE)
    se.play
    #
  end # make_ecatb_act

  #----------------------------------------------------------------------------|
  #  Marks a battler to become unable to act                                   |
  #----------------------------------------------------------------------------|
  def del_ecatb_act(battler) # New
    # Removes that battler from the actable battler and actor list for actors
    return unless @action_battlers.include?(battler)
    @action_battlers.delete(battler)
    battler.clear_actions
    return unless battler.actor? && @ecatb_actor_act_list.include?(battler)
    @ecatb_actor_act_list.delete(battler)
    clear_actor if actor == self
    #
  end # del_ecatb_act

  #----------------------------------------------------------------------------|
  #  Returns the list of all currently inputable actors                        |
  #----------------------------------------------------------------------------|
  # id : The inputable actor id list request flag
  def ecatb_input_list(id = false) # New; Hotspot
    block = DoubleX_RMVXA::ECATB::BLOCKS
    list = @ecatb_actor_act_list.select(&block[:ecatb_input_list_1])
    id ? list.collect!(&block[:ecatb_input_list_2]) : list
  end # ecatb_input_list

  # actors: The unison actors
  def ecatb_pool_reset(battler, actors) # v0.05a+; New
    # Ensures no repeated ecatb_reset call for any battler including unison ones
    if @ecatb_pool_reset_lock.include?(battler)
      return @ecatb_pool_reset_lock.delete(battler)
    end
    battlers = battler.actor? ? @ecatb_actor_act_list : 
    @action_battlers - @ecatb_actor_act_list
    @ecatb_pool_reset_lock = battlers - [battler]
    (battlers - actors - [battler]).each(
    &DoubleX_RMVXA::ECATB::BLOCKS[:ecatb_reset])
    #
  end # ecatb_pool_reset

  #----------------------------------------------------------------------------|
  #  Checks if the battler atb values should be continually updated            |
  #----------------------------------------------------------------------------|
  def ecatb_ctb_break? # v0.04d+; New; Hotspot
    return true if $game_message.visible
    # Checks if the battle ended, action's executing or command window's showing
    return true if $game_party.all_dead? || $game_troop.all_dead?
    return true unless @phase && @ecatb_can_esc && ecatb_ctb
    return true unless SceneManager.scene_is?(Scene_Battle)
    block = DoubleX_RMVXA::ECATB::BLOCKS
    return true if $game_party.alive_members.any?(&block[:ecatb_refresh])
    return true if $game_troop.alive_members.any?(&block[:ecatb_refresh])
    @action_battlers.any?(&block[:ecatb_ctb_break?])
    #
  end # ecatb_ctb_break?

  #----------------------------------------------------------------------------|
  #  Tries to pick an inputable actor and returns if the attempt succeeded     |
  #----------------------------------------------------------------------------|
  def ecatb_update_act_actor? # v0.04d+; New; Hotspot
    # Points the actor index to the 1st inputable actor if any
    return false if (act_list = ecatb_input_list(true)).empty?
    @actor_index = act_list[0]
    #
  end # ecatb_update_act_actor?

  #----------------------------------------------------------------------------|
  #  Picks the prior or next inputable actor and returns the result            |
  #----------------------------------------------------------------------------|
  # sign: Indicator of whether the prior or next actor is to be picked
  def change_ecatb_actor?(sign) # v0.04d+; New; Potential Hotspot
    # Points the actor index to the prior or next actor if any
    return false if (act_list = ecatb_input_list(true)).empty?
    act_list.sort! { |a, b| a * sign <=> b * sign }.each { |a_index|
      return @actor_index = a_index if @actor_index * sign < a_index * sign
    }
    @actor_index = act_list[0]
    #
  end # change_ecatb_actor?

  #----------------------------------------------------------------------------|
  #  Lets the compatibility fix deals with compatibility issues                |
  #----------------------------------------------------------------------------|
  def set_ecatb_esc_cost_compatibility # New
    0.1
  end # set_ecatb_esc_cost_compatibility

end # BattleManager

#------------------------------------------------------------------------------|
#  * Temporarily stores the blocks right before clearing them                  |
#------------------------------------------------------------------------------|
class Game_Temp # v0.02c+; Edit

  #----------------------------------------------------------------------------|
  #  New public instance variables                                             |
  #----------------------------------------------------------------------------|
  attr_accessor :ecatb_add_actors # The member adding flag
  attr_accessor :ecatb_remove_actors # The member removing flag
  attr_reader :ecatb_unison_actors # All battlers' cached unison actors
  attr_reader :last_ecatb_item # All battlers' cached last used item

  def init_ecatb_vars # v0.05a+; New
    @ecatb_add_actors = []
    @ecatb_remove_actors = []
    @ecatb_unison_actors = {}
    @last_ecatb_item = {}
  end # init_ecatb_vars

  def clear_ecatb_vars # v0.05a+; New
    @ecatb_add_actors = @ecatb_remove_actors = nil
    @ecatb_unison_actors = @last_ecatb_item = nil
  end # clear_ecatb_vars

end # Game_Temp

#------------------------------------------------------------------------------|
#  * Selects the battle system and stores all configuration values             |
#------------------------------------------------------------------------------|
class Game_System # Edit

  #----------------------------------------------------------------------------|
  #  New public instance variables                                             |
  #----------------------------------------------------------------------------|
  # Stores all configuration values
  DoubleX_RMVXA::ECATB::CONFIG.each { |configs|
    configs.each_key { |config| attr_accessor eval(":#{config.id2name}") }
  }
  #

  #----------------------------------------------------------------------------|
  #  Stores all configuration values as well                                   |
  #----------------------------------------------------------------------------|
  alias initialize_ecatb initialize
  def initialize(*argv, &argb)
    initialize_ecatb(*argv, &argb)
    init_ecatb_configs # Added
  end # initialize

  #----------------------------------------------------------------------------|
  #  Set the battle system as :ecatb for using the ecatb battle system         |
  #----------------------------------------------------------------------------|
  alias set_battle_system_ecatb set_battle_system
  def set_battle_system(type, &argb)
    return @battle_system = :ecatb if type == :ecatb # Added
    set_battle_system_ecatb(type, &argb)
  end # set_battle_system

  #----------------------------------------------------------------------------|
  #  Returns :ecatb if using the ecatb battle system                           |
  #----------------------------------------------------------------------------|
  alias battle_system_corrected_ecatb battle_system_corrected
  def battle_system_corrected(type, &argb)
    # Rewritten
    type == :ecatb ? :ecatb : battle_system_corrected_ecatb(type, &argb)
    #
  end # battle_system_corrected

  #----------------------------------------------------------------------------|
  #  Stores all configuration values into this class's new variables           |
  #----------------------------------------------------------------------------|
  def init_ecatb_configs # New
    DoubleX_RMVXA::ECATB::CONFIG.each { |configs|
      configs.each { |config, val| send(:"#{config}=", val) }
    }
  end # init_ecatb_configs

end # Game_System

#------------------------------------------------------------------------------|
#  * Adds the action input confirmation flag for action executions             |
#------------------------------------------------------------------------------|
class Game_Action # Edit

  #----------------------------------------------------------------------------|
  #  New public instance variables                                             |
  #----------------------------------------------------------------------------|
  attr_accessor :last_ecatb_confirm # The last action confirmation flag
  attr_writer :ecatb_confirm # The action confirmation flag

  #----------------------------------------------------------------------------|
  #  Cancel the input confirmation as well                                     |
  #----------------------------------------------------------------------------|
  alias clear_ecatb clear
  def clear(*argv, &argb)
    clear_ecatb(*argv, &argb)
    @ecatb_confirm = @last_ecatb_confirm = false # Added
  end # clear

  #----------------------------------------------------------------------------|
  #  Corrects the action confirmation flag before returning it                 |
  #----------------------------------------------------------------------------|
  def ecatb_confirm # New
    @ecatb_confirm ||= !@subject.inputable?
  end # ecatb_confirm

end # Game_Action

#------------------------------------------------------------------------------|
#  * Implements the battler's calculations and decision making criteria        |
#------------------------------------------------------------------------------|
class Game_BattlerBase # Edit

  #----------------------------------------------------------------------------|
  #  Raises the display redraw and cached notetag value reevaluation flags also|
  #----------------------------------------------------------------------------|
  alias erase_state_ecatb erase_state
  def erase_state(state_id, &argb)
    # Added
    if @states.include?(state_id)
      @ecatb_countdown_clock.delete(state_id)
      @ecatb_countdown_freeze.delete(state_id)
    end
    #
    erase_state_ecatb(state_id, &argb)
    set_ecatb_battler_change # Added
  end # erase_state

  #----------------------------------------------------------------------------|
  #  Raises the display redraw and cached notetag value reevaluation flags also|
  #----------------------------------------------------------------------------|
  alias tp_equal_ecatb tp=
  def tp=(tp, &argb)
    tp_equal_ecatb(tp, &argb)
    set_ecatb_battler_change # Added
  end # tp=

  #----------------------------------------------------------------------------|
  #  Raises the display redraw and cached notetag value reevaluation flags also|
  #----------------------------------------------------------------------------|
  alias refresh_ecatb refresh
  def refresh(*argv, &argb)
    refresh_ecatb(*argv, &argb)
    set_ecatb_battler_change # Added
  end # refresh

  #----------------------------------------------------------------------------|
  #  Resets the battler's atb values and clear all actions as well             |
  #----------------------------------------------------------------------------|
  alias hide_ecatb hide # v0.04c+
  def hide(*argv, &argb)
    hide_ecatb(*argv, &argb)
    ecatb_reset(true) # Added
  end # hide

  #----------------------------------------------------------------------------|
  #  Checks if the user's charging and the costs need to be paid now as well   |
  #----------------------------------------------------------------------------|
  alias skill_cost_payable_ecatb? skill_cost_payable?
  def skill_cost_payable?(skill, &argb)
    return true if skill_cost_payable_ecatb?(skill, &argb) # Rewritten
    # Added
    return false unless BattleManager.btype?(:ecatb)
    return false if @ecatb_val[:charge] <= 0.0
    !DoubleX_RMVXA::ECATB.send(skill.ecatb_charge_prior_item_cost, self)
    #
  end # skill_cost_payable?

  #----------------------------------------------------------------------------|
  #  Checks if all unison battlers have enough action points as well           |
  #----------------------------------------------------------------------------|
  alias usable_ecatb? usable?
  def usable?(item, &argb)
    # Added
    if BattleManager.btype?(:ecatb) && item && item.is_a?(RPG::UsableItem)
      if SceneManager.scene_is?(Scene_Battle)
        ecatb = DoubleX_RMVXA::ECATB
        if actor?
          actors = ecatb.send(item.ecatb_unison_actor, self).collect!(
          &ecatb::BLOCKS[:usable?])
          return ecatb_unison_usable?(item, actors) if actors.size > 1
        end
        return false if @ecatb_val[:charge] <= 0.0 && @ecatb_act_times < 
        ecatb.send(item.ecatb_act_cost, self)
      end
    end
    #
    usable_ecatb?(item, &argb)
  end # usable?(item)

  # act_times: The number of action points
  def ecatb_act_times=(act_times) # New
    return if @ecatb_act_times == act_times
    @ecatb_act_times = act_times
    set_ecatb_battler_change
  end # ecatb_act_times=

  #----------------------------------------------------------------------------|
  #  Raises the display redraw and cached notetag value reevaluation flags     |
  #----------------------------------------------------------------------------|
  def set_ecatb_battler_change # New
    @ecatb_battler_change ||= {}
    [:act, :atb, :charge, :cooldown, :order_icon, :order_opacity, :order_scale, 
     :order_z, :rate, :se, :speed].each { |t| @ecatb_battler_change[t] = true }
    @ecatb_refresh = true
  end # set_ecatb_battler_change

  #----------------------------------------------------------------------------|
  #  Returns the currently displayed atb bar type                              |
  #----------------------------------------------------------------------------|
  def ecatb_bar_type # New; Hotspot
    return :cooldown if @ecatb_val[:cooldown] > 0.0
    @ecatb_val[:charge] > 0.0 ? :charge : :atb
  end # ecatb_bar_type

  #----------------------------------------------------------------------------|
  #  Returns the charge gain and cooldown loss value per frame                 |
  #----------------------------------------------------------------------------|
  # v0.02c+; New; Hotspot
  DoubleX_RMVXA::ECATB::CHARGE_COOLDOWN_RATE.each_value { |v| module_eval(v) }
  #

  #----------------------------------------------------------------------------|
  #  Caches and returns the atb rate                                           |
  #----------------------------------------------------------------------------|
  def ecatb_gain_rate # New; Hotspot
    # Reevaluates the atb rate only if any of its determinators' changed
    return @ecatb_rate[:atb] unless BattleManager.ecatb_base_change || 
    ecatb_battler_change?(:rate)
    @ecatb_rate[:atb] = set_ecatb_gain_rate(BattleManager.ecatb_base.clone)
    #
  end # ecatb_gain_rate

  #----------------------------------------------------------------------------|
  #  Evaluates the value of all atb gain rate notetags using its ordering      |
  #----------------------------------------------------------------------------|
  # base: The base atb gain rate
  def set_ecatb_gain_rate(base) # v0.05a+; New; Potential Hotspot
    ecatb = DoubleX_RMVXA::ECATB
    ecatb_rate_ord.each { |data|
      next unless send(@ecatb_item[data][0])
      send(@ecatb_item[data][1]).each { |item|
        (0..(item.ecatb_notes[:rate].size - 1)).each { |index|
          next unless note = item.ecatb_notes[:rate][index]
          base[:val] = ecatb.send(note, self, base)
        }
      }
    }
    base[:val]
  end # set_ecatb_gain_rate

  #----------------------------------------------------------------------------|
  #  Sets the current battler gradual action gain flag when its notetags change|
  #----------------------------------------------------------------------------|
  def set_gradual_ecatb_act_gain # v0.05a+; New; Hotspot
    # Updates the battler gradual action gain notetags using the current order
    return @ecatb_notes[:act] unless ecatb_battler_change?(:act)
    @ecatb_notes[:act] = nil
    gradual_ecatb_action_gain_ord.each { |data|
      if send(@ecatb_item[data][0])
        set_ecatb_notes(send(@ecatb_item[data][1]), :act)
      end
      return @ecatb_notes[:act] unless @ecatb_notes[:act].nil?
    }
    @ecatb_notes[:act] = gradual_ecatb_action_gain
    #
  end # set_gradual_ecatb_act_gain

  #----------------------------------------------------------------------------|
  #  Sets the color of the current atb bar type when its notetags change       |
  #----------------------------------------------------------------------------|
  # type: The atb type
  def set_ecatb_bar_colors(type) # New; Potential Hotspot
    # Updates the color notetags using the current order of the current atb type
    @ecatb_notes[type].clear
    (color_ord = set_ecatb_bar_color_ord(type))[0].each { |data|
      if send(@ecatb_item[data][0])
        set_ecatb_bar_color_notes(send(@ecatb_item[data][1]), type)
      end
      return if @ecatb_notes[type].size == 2
    }
    color_ord[1].each_with_index { |color, i| @ecatb_notes[type][i] ||= color }
    #
  end # set_ecatb_bar_colors

  #----------------------------------------------------------------------------|
  #  Returns the atb bar color orders and default values for current type      |
  #----------------------------------------------------------------------------|
  # type: The atb type
  def set_ecatb_bar_color_ord(type) # New; Potential Hotspot
    return [ecatb_bar_color_ord, ecatb_bar_colors] if type == :atb
    if type == :charge
      return [ecatb_charge_bar_color_ord, ecatb_charge_bar_colors]
    elsif type == :cooldown
      return [ecatb_cooldown_bar_color_ord, ecatb_cooldown_bar_colors]
    end
    [[], []] # Does nothing if type stores an invalid value
  end # set_ecatb_bar_color_ord(type)

  #----------------------------------------------------------------------------|
  #  Evaluates the value of all atb bar color notetags using their orderings   |
  #----------------------------------------------------------------------------|
  # items: The data containing the notetags
  # note: The notetag type
  def set_ecatb_bar_color_notes(items, note) # v0.05a+; New; Potential Hotspot
    # Reads all item's atb bar color 1 and 2 notetag values
    ecatb = DoubleX_RMVXA::ECATB
    items.each { |item|
      return if @ecatb_notes[note].size >= 2
      n = item.ecatb_notes[note][0]
      @ecatb_notes[note][0] ||= ecatb.send(n, self) if n
      next unless n = item.ecatb_notes[note][1]
      @ecatb_notes[note][1] ||= ecatb.send(n, self)
    }
    #
  end # set_ecatb_bar_color_notes

  #----------------------------------------------------------------------------|
  #  Reads all atb order battler icon, opacity, scale and z notes              |
  #----------------------------------------------------------------------------|
  # v0.01a+; New; Potential Hotspot
  DoubleX_RMVXA::ECATB::ORDER.each_value { |method| module_eval(method) }
  #

  #----------------------------------------------------------------------------|
  #  Sets the current battler ready se when its notetags change                |
  #----------------------------------------------------------------------------|
  def set_ecatb_se_ready_act # New
    # Updates the battler ready se notetags using the current order
    return @ecatb_notes[:se] unless ecatb_battler_change?(:se)
    @ecatb_notes[:se] = nil
    ecatb_se_ready_act_ord.each { |data|
      if send(@ecatb_item[data][0])
        set_ecatb_notes(send(@ecatb_item[data][1]), :se)
      end
      return @ecatb_notes[:se] if @ecatb_notes[:se]
    }
    @ecatb_notes[:se] = ecatb_se_ready_act
    #
  end # set_ecatb_se_ready_act

  #----------------------------------------------------------------------------|
  #  Sets the current battler action input speed reduction in frames           |
  #----------------------------------------------------------------------------|
  def set_ecatb_speed_reduce # v0.02a+; New
    # Updates the battler speed reduce notetags using the current order
    ecatb = DoubleX_RMVXA::ECATB
    ecatb_speed_reduce_ord.each { |data|
      next unless send(@ecatb_item[data][0])
      send(@ecatb_item[data][1]).each { |item|
        (0..(item.ecatb_notes[:speed].size - 1)).each { |index|
          next unless note = item.ecatb_notes[:speed][index]
          ecatb.send(note, self)
        }
      }
    }
    #
  end # set_ecatb_speed_reduce

  #----------------------------------------------------------------------------|
  #  Sets the starting atb value of the start type at the start of a battle    |
  #----------------------------------------------------------------------------|
  # start: The battle start type
  def set_ecatb_start_val(start) # New
    # Updates the start notetags of the start type using the current order
    ecatb = DoubleX_RMVXA::ECATB
    ecatb_start_val_ord.each { |data|
      next unless send(@ecatb_item[data][0])
      send(@ecatb_item[data][1]).each { |item|
        (0..(item.ecatb_notes[start].size - 1)).each { |index|
          next unless note = item.ecatb_notes[start][index]
          ecatb.send(note, self)
        }
      }
    }
    #
  end # set_ecatb_start_val

  #----------------------------------------------------------------------------|
  #  Evaluates the value of all specified notetags using their orderings       |
  #----------------------------------------------------------------------------|
  # items: The data containing the notetags
  # note: The notetag type
  def set_ecatb_notes(items, note) # New; Potential Hotspot
    # Reads all item's speficied notetag values until the maximum size's reached
    ecatb = DoubleX_RMVXA::ECATB
    items.each { |item|
      return if @ecatb_notes[note]
      next unless n = item.ecatb_notes[note]
      @ecatb_notes[note] = ecatb.send(n, self)
    }
    #
  end # set_ecatb_notes

  #----------------------------------------------------------------------------|
  #  Checks if any new notetag added, old one gone or its value changed        |
  #----------------------------------------------------------------------------|
  # note: The notetag type to be checked
  def ecatb_battler_change?(note) # New; Hotspot
    change = @ecatb_note_change[note]
    @ecatb_note_change[note] &&= !change
    return change unless @ecatb_battler_change[note]
    !(@ecatb_battler_change[note] = false)
  end # ecatb_battler_change?

  #----------------------------------------------------------------------------|
  #  Checks if charging should take place                                      |
  #----------------------------------------------------------------------------|
  def ecatb_charge_update? # New; Hotspot
    return false if @ecatb_val[:cooldown] > 0.0 || @ecatb_val[:atb] < 100.0
    return false unless current_action
    return enemy? || current_action.ecatb_confirm if current_action.item
    !(@ecatb_val[:charge] = 0.0)
  end # ecatb_charge_update?

  #----------------------------------------------------------------------------|
  #  Checks if the unison skill/item can continue charging                     |
  #----------------------------------------------------------------------------|
  def ecatb_unison_charge_update? # New; Hotspot
    return false unless actor? && current_action && item = current_action.item
    # Rechecks the unison skill/item usability if any unison actor's refreshed
    return usable?(item) if @ecatb_unison_actors.any?(
    &DoubleX_RMVXA::ECATB::BLOCKS[:ecatb_refresh])
    #
    true
  end # ecatb_unison_charge_update?

  #----------------------------------------------------------------------------|
  #  Checks if the battler's actions should be executed                        |
  #----------------------------------------------------------------------------|
  def exec_ecatb_act? # New; Hotspot
    # Checks if the battler's valid and has valid input being fully charged
    return false if ecatb_val[:charge] < 100.0 || ecatb_val[:atb] < 100.0
    enemy? || input && input.item && input.ecatb_confirm
    #
  end # exec_ecatb_act?

  #----------------------------------------------------------------------------|
  #  Helper methods used by @ecatb_item                                        |
  #----------------------------------------------------------------------------|

  def ecatb_states # New; Potential Hotspot
    @states
  end # ecatb_states

  def ecatb_enemy # New; Potential Hotspot
    [enemy]
  end # ecatb_enemy

  def enemy # New; Potential Hotspot
  end # enemy

  def armors # New; Potential Hotspot
    []
  end # armors

  def weapons # New; Potential Hotspot
    []
  end # armors

  def ecatb_class # New; Potential Hotspot
    [self.class]
  end # ecatb_class

  def class # New; Potential Hotspot
  end # class

  def ecatb_actor # New; Potential Hotspot
    [actor]
  end # ecatb_actor

  def actor # New
  end # actor

  #----------------------------------------------------------------------------|
  #  Lets the compatibility fix deals with compatibility issues                |
  #----------------------------------------------------------------------------|
  def ecatb_reset_compatibility? # New
  end # ecatb_reset_compatibility?

end # Game_BattlerBase

#------------------------------------------------------------------------------|
#  * Implements the battler's atb actions, control flows and logics            |
#------------------------------------------------------------------------------|
class Game_Battler < Game_BattlerBase # Edit

  #----------------------------------------------------------------------------|
  #  New public instance variables                                             |
  #----------------------------------------------------------------------------|
  attr_accessor :ecatb_act_times_add # The action point increment
  attr_accessor :ecatb_act_times_cap # The action point cap reaching flag
  attr_accessor :ecatb_refresh # The refresh calling flag
  attr_accessor :ecatb_reset_val # The atb reset value upon resetting atb
  attr_accessor :ecatb_unison_invoker # The unison skill/item invoker flag
  attr_accessor :ecatb_val_change # The atb value change flags
  attr_reader :ecatb_act_times # The number of action points
  attr_reader :ecatb_countdown_freeze # The countdown freeze statuses
  attr_reader :ecatb_note_change # The notetag value change flags
  attr_reader :ecatb_notes # The caches of all notetags used
  attr_reader :ecatb_rate # The cached atb rates
  attr_reader :ecatb_unison_actors # The cached unison actor list
  attr_reader :ecatb_unison_rule # The cached unison charge/cooldown rule
  attr_reader :ecatb_val # The atb values
  attr_writer :ecatb_unison_item # The unison skill/item for damage evaluation

  #----------------------------------------------------------------------------|
  #  New private instance variables                                            |
  #----------------------------------------------------------------------------|
  # @ecatb_battler_change: The battler data change flags
  # @ecatb_countdown_updates: The countdown update method iterator block
  # @ecatb_item: The notetag value reader storing data types with their ordering
  # @ecatb_item_change: The skill/item usage change flags
  # @ecatb_speed_reduce: The action input speed frame number
  # @fail_ecatb_esc: The party escape attempt failure flag
  # @last_ecatb_item: The last item used/being used
  # @last_ecatb_rate: The last atb gain rate
  # @last_ecatb_speed_reduce: The last action input speed frame number
  # @max_ecatb_act_times The maximum number of action points
  # @temp_ecatb_act_times The temporary number of action points

  #----------------------------------------------------------------------------|
  #  Updates states with different auto removal timing to at different timings |
  #----------------------------------------------------------------------------|
  def update_state_turns # Rewrite
    ecatb_update_state_turns(2) # Rewritten
  end # update_state_turns

  #----------------------------------------------------------------------------|
  #  Fixes bugs and initializes all new variables as well                      |
  #----------------------------------------------------------------------------|
  alias initialize_ecatb initialize
  def initialize(*argv, &argb)
    initialize_ecatb(*argv, &argb)
    init_ecatb_vars # Added to let created methods to use new variables as well
  end # initialize

  #----------------------------------------------------------------------------|
  #  Raises the display redraw and cached notetag value reevaluation flags also|
  #----------------------------------------------------------------------------|
  alias clear_states_ecatb clear_states
  def clear_states(*argv, &argb)
    clear_states_ecatb(*argv, &argb)
    # Added
    set_ecatb_battler_change
    @ecatb_countdown_clock = {}
    @ecatb_countdown_freeze = {}
    #
  end # clear_states

  #----------------------------------------------------------------------------|
  #  Raises the display redraw and cached notetag value reevaluation flags also|
  #----------------------------------------------------------------------------|
  alias add_new_state_ecatb add_new_state # v0.05a+
  def add_new_state(state_id, &argb)
    add_new_state_ecatb(state_id, &argb)
    set_ecatb_battler_change # Added
  end # add_new_state

  #----------------------------------------------------------------------------|
  #  Clears the atb values but not action points in the ecatb battle system    |
  #----------------------------------------------------------------------------|
  alias on_restrict_ecatb on_restrict
  def on_restrict(*argv, &argb)
    # Rewritten
    return on_restrict_ecatb(*argv, &argb) unless BattleManager.btype?(:ecatb)
    #
    # Added
    ecatb_reset
    states.each { |s| remove_state(s.id) if s.remove_by_restriction }
    #
  end # on_restrict

  #----------------------------------------------------------------------------|
  #  Initializes the state's countdown as well if any                          |
  #----------------------------------------------------------------------------|
  alias reset_state_counts_ecatb reset_state_counts
  def reset_state_counts(state_id, &argb)
    reset_state_counts_ecatb(state_id, &argb)
    # Added
    return unless $data_states[state_id].ecatb_countdown_interval
    return unless @states.include?(state_id)
    @ecatb_countdown_clock[state_id] = 0
    @ecatb_countdown_freeze[state_id] = false
    #
  end # reset_state_counts

  #----------------------------------------------------------------------------|
  #  Ensures only 1 non forced action can be inputted and executed at a time   |
  #----------------------------------------------------------------------------|
  alias make_action_times_ecatb make_action_times
  def make_action_times(*argv, &argb)
    # Rewritten
    BattleManager.btype?(:ecatb) ? 1 : make_action_times_ecatb(*argv, &argb)
    #
  end # make_action_times

  #----------------------------------------------------------------------------|
  #  Preserves the existing actions but executes the forced one first instead  |
  #----------------------------------------------------------------------------|
  alias force_action_ecatb force_action
  def force_action(skill_id, target_index, &argb)
    # Added
    if BattleManager.btype?(:ecatb)
      return set_ecatb_force_action(skill_id, target_index)
    end
    #
    force_action_ecatb(skill_id, target_index, &argb)
  end # force_action

  #----------------------------------------------------------------------------|
  #  Sets and resets user's methods before and after using an unison skill/item|
  #----------------------------------------------------------------------------|
  alias make_damage_value_ecatb make_damage_value
  def make_damage_value(user, item, &argb)
    # Added
    if user.actor? && user.ecatb_unison_actors.size > 1
      user.ecatb_unison_item = item
    end
    #
    make_damage_value_ecatb(user, item, &argb)
    user.ecatb_unison_item = nil # Added
  end # make_damage_value

  #----------------------------------------------------------------------------|
  #  Asks all unison invokees to pay the skill/item costs for unison skill/item|
  #----------------------------------------------------------------------------|
  alias use_item_ecatb use_item
  def use_item(item, &argb)
    # Rewritten
    return use_item_ecatb(item, &argb) unless BattleManager.btype?(:ecatb)
    #
    # Added
    unless DoubleX_RMVXA::ECATB.send(item.ecatb_charge_prior_item_cost, self)
      return item.effects.each { |effect| item_global_effect_apply(effect) }
    end
    return if @ecatb_unison_actors.size <= 1
    @ecatb_unison_actors.each { |actor| actor.pay_skill_cost(item) }
    item.effects.each { |effect| item_global_effect_apply(effect) }
    #
  end # use_item

  #----------------------------------------------------------------------------|
  #  Updates states with Auto-removal Timing being Action End as well          |
  #----------------------------------------------------------------------------|
  alias on_action_end_ecatb on_action_end
  def on_action_end(*argv, &argb)
    on_action_end_ecatb(*argv, &argb)
    ecatb_update_state_turns(1) if BattleManager.btype?(:ecatb) # Added
  end # on_action_end

  #----------------------------------------------------------------------------|
  #  Removes buffs and debuffs having 0 remaining turns as well                |
  #----------------------------------------------------------------------------|
  alias on_turn_end_ecatb on_turn_end
  def on_turn_end(*argv, &argb)
    on_turn_end_ecatb(*argv, &argb)
    remove_buffs_auto if BattleManager.btype?(:ecatb) # Added
  end # on_turn_end

  #----------------------------------------------------------------------------|
  #  Frees up unnecessary memory usage upon battle end                         |
  #----------------------------------------------------------------------------|
  alias on_battle_end_ecatb on_battle_end
  def on_battle_end(*argv, &argb) # v0.02c+
    on_battle_end_ecatb(*argv, &argb)
    # Added to clear all new variables that are only used in battles
    clear_ecatb_vars
    #
  end # on_battle_end

  #----------------------------------------------------------------------------|
  #  Preserves the existing actions but executes the forced one first          |
  #----------------------------------------------------------------------------|
  def set_ecatb_force_action(skill_id, target_index) # New
    @ecatb_unison_invoker = false
    @ecatb_unison_rule.clear
    (act = Game_Action.new(self, true)).set_skill(skill_id)
    if target_index == -2
      act.target_index = last_target_index
    elsif target_index == -1
      act.decide_random_target
    else
      act.target_index = target_index
    end
    @actions.unshift(act)
  end # set_ecatb_force_action

  #----------------------------------------------------------------------------|
  #  Initializes all new variables before checking any configuration validities|
  #----------------------------------------------------------------------------|
  def init_ecatb_vars # New
    @ecatb_esc = false
    @ecatb_item_change = {}
    @ecatb_note_change = {}
    @ecatb_notes = {}
    [:atb, :charge, :cooldown].each { |type| @ecatb_notes[type] = [] }
    @ecatb_unison_actors = []
    @ecatb_unison_rule = {}
    init_ecatb_block
    init_ecatb_item_vars
    init_ecatb_val_vars
  end # init_ecatb_vars

  def init_ecatb_val_vars # New
    @ecatb_act_times = @ecatb_act_times_add = @temp_ecatb_act_times = 0
    @ecatb_speed_reduce = @last_ecatb_speed_reduce = 0
    @ecatb_rate = {}
    @ecatb_reset_val = 0.0
    @ecatb_val = { atb: 0.0, charge: 0.0, cooldown: 0.0 }
    @ecatb_val_change = true
    @last_ecatb_rate = { charge: -1, cooldown: -1 }
    @max_ecatb_act_times = 1
  end # init_ecatb_val_vars

  def init_ecatb_item_vars # New
    @ecatb_item = {}
    notes = [:states, :enemies, :armors, :weapons, :classes, :actors]
    conds = [:ecatb_states, :enemy?, :actor?, :actor?, :actor?, :actor?]
    items = [:states, :ecatb_enemy, :armors, :weapons, :ecatb_class,
             :ecatb_actor]
    notes.each_with_index { |n, i| @ecatb_item[n] = [conds[i], items[i]] }
  end # init_ecatb_item_vars

  #----------------------------------------------------------------------------|
  #  Initializes the new block to trade memory usage for time performance      |
  #----------------------------------------------------------------------------|
  def init_ecatb_block # New
    # Calls this block instead of an anonymous function per enumerable iteration
    @ecatb_countdown_updates = -> state_id {
      next if @ecatb_countdown_freeze[state_id]
      next if (@ecatb_countdown_clock[state_id] += 1) % ecatb_countdown_min != 0
      @ecatb_countdown_clock[state_id] %= Graphics.frame_rate * DoubleX_RMVXA::
      ECATB.send($data_states[state_id].ecatb_countdown_interval, self)
      next if @ecatb_countdown_clock[state_id] != 0
      if @state_turns[state_id] > 0
        @state_turns[state_id] -= 1
        set_ecatb_battler_change
      end
      ecatb_countdown_update_compatibility_3(state_id)
      next unless @ecatb_battler_sprite
      ecatb_countdown_update_compatibility_2(@ecatb_battler_sprite, state_id)
    }
    #
  end # init_ecatb_block

  #----------------------------------------------------------------------------|
  #  Clears all variables that are useless outside battles upon battle end     |
  #----------------------------------------------------------------------------|
  def clear_ecatb_vars # v0.05a+; New
    clear_ecatb_blocks
    @ecatb_item = @ecatb_item_change = @ecatb_note_change = @ecatb_notes = nil
    @ecatb_rate = @ecatb_unison_actors = @ecatb_unison_rule = @ecatb_val = nil
    @ecatb_val_change = nil
  end # clear_ecatb_vars

  #----------------------------------------------------------------------------|
  #  Clears all cached blocks used in battles                                  |
  #----------------------------------------------------------------------------|
  def clear_ecatb_blocks # v0.01a; New
    # Clears all cached notetag values, the unison actor id list and skill/item
    if @ecatb_notes[:order_icon]
      bitmap = @ecatb_notes[:order_icon][0]
      bitmap.dispose if bitmap && !bitmap.disposed?
    end
    [:act, :order_icon, :order_opacity, :order_scale, :order_z, :se].each { 
    |type| @ecatb_notes.delete(type) }
    [:atb, :charge, :cooldown].each { |type| @ecatb_notes[type].clear }
    $game_temp.ecatb_unison_actors[self] ||= @ecatb_unison_actors
    @ecatb_unison_actors.clear
    $game_temp.last_ecatb_item[self] ||= @last_ecatb_item
    @ecatb_battler_sprite = @ecatb_countdown_updates = @last_ecatb_item = nil
    #
  end # clear_ecatb_blocks

  #----------------------------------------------------------------------------|
  #  Resets all cached blocks used in battles                                  |
  #----------------------------------------------------------------------------|
  def reset_ecatb_blocks # v0.01a; New
    # Marks that all cached notetag values have to reread and restores the rest
    set_ecatb_battler_change
    if $game_temp.ecatb_unison_actors[self]
      @ecatb_unison_actors = $game_temp.ecatb_unison_actors.delete(self)
    end
    if $game_temp.last_ecatb_item[self]
      @last_ecatb_item = $game_temp.last_ecatb_item.delete(self)
    end
    init_ecatb_block
    #
  end # reset_ecatb_blocks

  # start: The battle start type
  def set_ecatb_start_val(start = :start_0) # New
    init_ecatb_vars
    set_ecatb_battler_change
    # Applies all the read notetag values to the default starting atb value
    default_ecatb_start_val(start)
    super(start)
    #
  end # set_ecatb_start_val

  # timing: The state auto removal timing
  def ecatb_update_state_turns(timing) # New
    change = false
    states.each { |state|
      next if @state_turns[state.id] <= 0 || state.auto_removal_timing != timing
      @state_turns[state.id] -= 1
      change = true
    }
    set_ecatb_battler_change if change
  end # ecatb_update_state_turns

  #----------------------------------------------------------------------------|
  #  Performs all the battler's atb frame updates                              |
  #----------------------------------------------------------------------------|
  def ecatb_updates # New; Hotspot
    unless @ecatb_val[:atb] <= 100.0 || set_gradual_ecatb_act_gain
      @temp_ecatb_act_times = @max_ecatb_act_times
      @ecatb_val[:atb] = 100.0
      @max_ecatb_act_times = 1
    end
    return unless @ecatb_esc || movable = restriction < 4
    # Updates the atb values, speed and countdown statuses and makes actions
    ecatb_val_updates(movable)
    ecatb_countdown_update unless @ecatb_countdown_clock.empty?
    #
  end # ecatb_updates

  #----------------------------------------------------------------------------|
  #  (v0.04c)Updates atb, charge and cooldown, speed reduce and makes actions  |
  #----------------------------------------------------------------------------|
  def ecatb_val_updates(movable) # New; Hotspot
    return ecatb_charge_update if @ecatb_esc || movable && ecatb_charge_update?
    if !@ecatb_esc && movable
      return ecatb_cooldown_update if @ecatb_val[:cooldown] > 0.0
      ecatb_update if @ecatb_val[:atb] < 100.0 * @max_ecatb_act_times
      return if @ecatb_val[:atb] < 100.0
      return ecatb_speed_reduce_update if @ecatb_speed_reduce > 0
    end
    make_ecatb_act unless @ecatb_val[:atb] < 100.0 || @ecatb_val[:charge] > 
    0.0 || ecatb_reset_compatibility? || actor? && inputable? && 
    current_action && current_action.item && current_action.ecatb_confirm
  end # ecatb_val_updates

  #----------------------------------------------------------------------------|
  #  Updates the atb cooldown value and triggers cooldown finish upon finishing|
  #----------------------------------------------------------------------------|
  def ecatb_cooldown_update # New; Hotspot
    @ecatb_val[:cooldown] -= ecatb_cooldown_loss_rate
    return if @ecatb_val[:cooldown] > 0.0
    @ecatb_val[:cooldown] = 0.0 if @ecatb_val[:cooldown] < 0.0
    @ecatb_unison_actors.clear
    @ecatb_unison_invoker = @fail_ecatb_esc = false
    @ecatb_unison_rule.clear
    ecatb_cooldown_finish
  end # ecatb_cooldown_update

  def ecatb_update # New; Hotspot
    # Raises the change flag upon atb value change and caps it to its max
    @ecatb_val_change = @ecatb_val[:atb] != @ecatb_val[:atb] += ecatb_gain_rate
    max = 100.0 * @max_ecatb_act_times
    @ecatb_val[:atb] = max if @ecatb_val[:atb] > max
    #
  end # ecatb_update

  #----------------------------------------------------------------------------|
  #  Updates the atb action input speed reduction by frames                    |
  #----------------------------------------------------------------------------|
  def ecatb_speed_reduce_update # v0.02a+; New; Hotspot
    # Returns the cached value unless it's to be reevalauted
    return set_ecatb_speed_reduce if ecatb_battler_change?(:speed)
    @ecatb_speed_reduce = 0 if (@ecatb_speed_reduce -= 1) < 0
    #
  end # ecatb_speed_reduce_update

  #----------------------------------------------------------------------------|
  #  Sets the atb action input speed reduction by frames                       |
  #----------------------------------------------------------------------------|
  def set_ecatb_speed_reduce # v0.02a+; New; Potential Hotspot
    # Adds the difference between the new and old to the current speed reduction
    last_speed_reduce = @last_ecatb_speed_reduce
    ecatb_speed_reduce
    super
    @ecatb_speed_reduce += @last_ecatb_speed_reduce - last_speed_reduce
    @ecatb_speed_reduce = 0 if @ecatb_speed_reduce < 0
    #
  end # set_ecatb_speed_reduce

  #----------------------------------------------------------------------------|
  #  Updates the atb charge value including the unison version                 |
  #----------------------------------------------------------------------------|
  def ecatb_charge_update # New; Hotspot
    unless @ecatb_unison_actors.size <= 1 || ecatb_unison_charge_update?
      return ecatb_reset
    end
    @ecatb_val[:charge] += ecatb_charge_gain_rate
    @ecatb_val[:charge] = 100.0 if @ecatb_val[:charge] > 100.0
  end # ecatb_charge_update

  #----------------------------------------------------------------------------|
  #  Makes actions and marks the battler as actable upon becoming able to act  |
  #----------------------------------------------------------------------------|
  def make_ecatb_act # New; Hotspot
    if @ecatb_act_times <= 0
      make_gradual_ecatb_act_gain
    elsif @ecatb_val[:atb] > 100.0
      make_ecatb_act_pool
    end
    BattleManager.make_ecatb_act(self)
  end # make_ecatb_act

  def make_gradual_ecatb_act_gain # v0.05a+; New
    unless set_gradual_ecatb_act_gain
      return @ecatb_act_times_add = @ecatb_act_times = 
      @temp_ecatb_act_times = make_action_times_ecatb
    end
    @ecatb_act_times_add = @ecatb_act_times = @temp_ecatb_act_times = 1
    @max_ecatb_act_times = make_action_times_ecatb
    # Prevents the previously reset atb value from exceeding the new maximum
    max = 100.0 * @max_ecatb_act_times
    @ecatb_val[:atb] = max if @ecatb_val[:atb] > max
    #
    set_ecatb_battler_change
  end # make_gradual_ecatb_act_gain

  #----------------------------------------------------------------------------|
  #  Synchronize the party/troop action point pool when changing action points |
  #----------------------------------------------------------------------------|
  def make_ecatb_act_pool # v0.05a+; New; Hotspot
    # Ensures that all party/troop members change their action points together
    return if 
    (act_add = @ecatb_val[:atb].to_i / 100 - @temp_ecatb_act_times) == 0
    @ecatb_act_times_add = act_add
    return if @ecatb_act_times_cap = 
    @temp_ecatb_act_times >= @max_ecatb_act_times
    @ecatb_act_times += @ecatb_act_times_add
    @temp_ecatb_act_times += @ecatb_act_times_add
    set_ecatb_battler_change
    #
  end # make_ecatb_act_pool

  #----------------------------------------------------------------------------|
  #  Updates all states' countdown clocks that aren't frozen if any            |
  #----------------------------------------------------------------------------|
  def ecatb_countdown_update # New; Hotspot
    @ecatb_battler_sprite ||= ecatb_countdown_update_compatibility_1
    # Checks if the clocks are divisible by seconds to boost time performance
    @ecatb_countdown_clock.each_key(&@ecatb_countdown_updates)
    #
    remove_states_auto(3)
  end # ecatb_countdown_update

  def confirm_ecatb_item # New
    # Recaches the cached values upon changes and pays costs now if specified
    @ecatb_item_change[:charge] = @ecatb_item_change[:cooldown] = 
    @last_ecatb_item != @last_ecatb_item = current_action.item
    pay_prior_ecatb_charge if @last_ecatb_item
    #
  end # confirm_ecatb_item

  def pay_prior_ecatb_charge # New
    ecatb = DoubleX_RMVXA::ECATB
    unless ecatb.send(@last_ecatb_item.ecatb_charge_prior_act_cost, self)
      pay_ecatb_unison_act_cost
    end
    return if ecatb.send(@last_ecatb_item.ecatb_charge_prior_item_cost, self)
    return consume_item(@last_ecatb_item) if @last_ecatb_item.is_a?(RPG::Item)
    pay_skill_cost(@last_ecatb_item) if @last_ecatb_item.is_a?(RPG::Skill)
  end # pay_prior_ecatb_charge

  #----------------------------------------------------------------------------|
  #  Pays the action cost and sets the atb reset value unless it's forced      |
  #----------------------------------------------------------------------------|
  # forced: The action force flag
  def exec_ecatb_act_cost(forced) # New
    return unless current_action && item = current_action.item
    ecatb = DoubleX_RMVXA::ECATB
    if (force_act_cost = ecatb.send(item.ecatb_force_act_cost, self)) || !forced
      # Pays the action cost now if the skill/item requests so
      if ecatb.send(item.ecatb_charge_prior_act_cost, self)
        pay_ecatb_unison_act_cost
      end
      #
      set_ecatb_reset_val
    end
    force_act_cost
  end # exec_ecatb_act_cost

  def pay_ecatb_unison_act_cost # New
    return pay_ecatb_act_cost if @ecatb_unison_actors.size <= 1
    @ecatb_unison_actors.each(
    &DoubleX_RMVXA::ECATB::BLOCKS[:pay_ecatb_act_cost])
  end # pay_ecatb_unison_act_cost

  def pay_ecatb_act_cost # New
    return unless current_action && item = current_action.item
    set_ecatb_battler_change
    cost = DoubleX_RMVXA::ECATB.send(item.ecatb_act_cost, self)
    @temp_ecatb_act_times -= cost
    unless friends_unit.ecatb_pool
      @ecatb_val[:atb] -= cost * 100.0 if set_gradual_ecatb_act_gain
      return @ecatb_act_times -= cost
    end
    size = (members = friends_unit.alive_members).size
    members.each { |mem|
      mem.ecatb_act_times -= cost
      next unless mem.set_gradual_ecatb_act_gain
      mem.ecatb_val[:atb] -= cost * 100.0 / size
    }
  end # pay_ecatb_act_cost

  def set_ecatb_reset_val # New
    # Sets all unison invokee's atb reset values as well for unison skill/item
    val = current_action.item.ecatb_reset_val
    @ecatb_reset_val = (ecatb = DoubleX_RMVXA::ECATB).send(val, self)
    return if @ecatb_unison_actors.size <= 1
    (@ecatb_unison_actors & $game_party.alive_members).each{ |actor|
      actor.ecatb_reset_val = ecatb.send(val, actor)
    }
    #
  end # set_ecatb_reset_val

  #----------------------------------------------------------------------------|
  #  Resets the atb values and reset value, speed reduce and action points     |
  #----------------------------------------------------------------------------|
  # reset: The atb reset flag
  def ecatb_reset(reset = restriction > 3) # New
    # Pays the escape cost, refreshes the battler and triggers the pre and post
    pre_ecatb_reset
    pay_ecatb_esc_cost if @ecatb_esc
    @ecatb_speed_reduce = 0
    @ecatb_val_change = true
    return ecatb_val_reset_compatibility(reset) if ecatb_reset_compatibility?
    BattleManager.del_ecatb_act(self)
    ecatb_act_val_reset(reset)
    post_ecatb_reset
    set_ecatb_battler_change
    #
  end # ecatb_reset

  # reset: The atb reset flag
  def ecatb_act_val_reset(reset) # New
    @ecatb_val[:cooldown] = 0.0 if dead?
    use_ecatb_reset_val if reset || @ecatb_act_times <= 0
    @temp_ecatb_act_times = @ecatb_act_times = 0 if reset && 
    @ecatb_act_times > 0
    @max_ecatb_act_times = 1 if reset || @ecatb_act_times <= 0
    ecatb_unison_reset(reset)
    @ecatb_val[:charge] = 0.0
    return if @ecatb_act_times > 0 && index && restriction <= 0
    @ecatb_reset_val = 0.0
  end # ecatb_act_val_reset

  def use_ecatb_reset_val # v0.04d+; New
    BattleManager.ecatb_pool_reset(self, @ecatb_unison_actors) if 
    friends_unit.ecatb_pool
    @ecatb_val[:atb] = @ecatb_reset_val
    return @ecatb_val[:atb] = 0.0 if @ecatb_val[:atb] < 0.0
    max = 100.0 * @max_ecatb_act_times
    @ecatb_val[:atb] = max if @ecatb_val[:atb] > max
  end # use_ecatb_reset_val

  def ecatb_unison_reset(reset) # v0.05a+; New
    # Clears the unison actor and invoker cache if there's no unison cooldown
    if reset || @ecatb_val[:charge] < 100.0
      @ecatb_unison_actors.clear
      @ecatb_unison_invoker = false
      return @ecatb_unison_rule.clear
    end
    #
    @ecatb_val[:cooldown] = 100.0
  end # ecatb_unison_reset

  #----------------------------------------------------------------------------|
  #  Lets the compatibility fix deals with compatibility issues                |
  #----------------------------------------------------------------------------|

  def ecatb_countdown_update_compatibility_1 # New; Hotspot
  end # ecatb_countdown_update_compatibility_1

  def ecatb_countdown_update_compatibility_2(battler_sprite, state_id) # New; 
  # Potential Hotspot
  end # ecatb_countdown_update_compatibility_2

  def ecatb_countdown_update_compatibility_3(state_id) # New; Potential Hotspot
  end # ecatb_countdown_update_compatibility_3

  # reset: The atb reset flag
  def ecatb_val_reset_compatibility(reset) # New
  end # ecatb_val_reset_compatibility

end # Game_Battler

#------------------------------------------------------------------------------|
#  * Implements the actor's additional atb actions, control flows and logics   |
#------------------------------------------------------------------------------|
class Game_Actor < Game_Battler # Edit

  #----------------------------------------------------------------------------|
  #  New public instance variable                                              |
  #----------------------------------------------------------------------------|
  attr_accessor :ecatb_esc # The party escape attempt flag

  #----------------------------------------------------------------------------|
  #  New private instance variable                                             |
  #----------------------------------------------------------------------------|
  # @ecatb_reserve: The reserved member flag

  #----------------------------------------------------------------------------|
  #  Creates new methods of all configurations used by actors as well          |
  #----------------------------------------------------------------------------|
  alias setup_ecatb setup
  def setup(actor_id, &argb)
    setup_ecatb(actor_id, &argb)
    # Added to fix nil @action_input_index and actors added during battle bugs
    @action_input_index = 0
    @ecatb_reserve = true
    create_ecatb_defs
    #
  end # setup

  #----------------------------------------------------------------------------|
  #  Confirms inputs made with the auto battle status as well                  |
  #----------------------------------------------------------------------------|
  alias make_auto_battle_actions_ecatb make_auto_battle_actions
  def make_auto_battle_actions(*argv, &argb) # v0.00d+
    make_auto_battle_actions_ecatb(*argv, &argb)
    # Added
    return unless BattleManager.btype?(:ecatb)
    confirm_ecatb_item
    set_ecatb_speed_reduce
    #
  end # make_auto_battle_actions

  #----------------------------------------------------------------------------|
  #  Confirms inputs made with the confusion status as well                    |
  #----------------------------------------------------------------------------|
  alias make_confusion_actions_ecatb make_confusion_actions
  def make_confusion_actions(*argv, &argb) # v0.00d+
    make_confusion_actions_ecatb(*argv, &argb)
    # Added
    return unless BattleManager.btype?(:ecatb)
    confirm_ecatb_item
    set_ecatb_speed_reduce
    #
  end # make_confusion_actions

  #----------------------------------------------------------------------------|
  #  Ensures actors added during battles are properly initialized as well      |
  #----------------------------------------------------------------------------|
  def on_battle_end(*argv, &argb) # v0.04e+; New
    super(*argv, &argb)
    @ecatb_reserve = true
  end # on_battle_end

  #----------------------------------------------------------------------------|
  #  Creates and checks the associated method for each configuration used here |
  #----------------------------------------------------------------------------|
  # config: The configuration requesting its associated method
  # validate: The configuration value validation flag
  def create_ecatb_def(config, validate = true) # New
    # Uses the name and value of configuration as its method's name and contents
    method = config.id2name
    eval(%Q(
  def #{method}#{DoubleX_RMVXA::ECATB::GAME_ACTOR[config][0]}
    #{$game_system.send(config)}
  end
    ))
    #
    return unless validate
    check_ecatb_def(method, DoubleX_RMVXA::ECATB::GAME_ACTOR[config])
  end # create_ecatb_def

  #----------------------------------------------------------------------------|
  #  Checks all new methods and resets them to the defaults if they're invalid |
  #----------------------------------------------------------------------------|
  module_eval(DoubleX_RMVXA::ECATB::CHECK_RESET_DEF[:GAME_ACTOR]) # New

  #----------------------------------------------------------------------------|
  #  Ensures actors added during battles are properly initialized as well      |
  #----------------------------------------------------------------------------|
  def set_ecatb_start_val(start = :start_0) # v0.04e+; New
    super(start)
    @ecatb_reserve = false
  end # set_ecatb_start_val

  # start: The battle start type
  def default_ecatb_start_val(start) # New
    return normal_actor_1st_ecatb_val if start == :start_0
    return preemptive_actor_1st_ecatb_val if start == :start_1
    surprise_actor_1st_ecatb_val
  end # default_ecatb_start_val

  #----------------------------------------------------------------------------|
  #  Ensures actors added during battles are properly initialized as well      |
  #----------------------------------------------------------------------------|
  def ecatb_updates # v0.04e+; New ; Hotspot
    if @ecatb_reserve
      init_ecatb_vars
      @ecatb_reserve = false
    end
    super
  end # ecatb_updates

  def confirm_ecatb_item # New
    super
    input.ecatb_confirm = input.last_ecatb_confirm = true
    # Caches the unison actors, charge and cooldown rules if any as well
    ecatb = DoubleX_RMVXA::ECATB
    @ecatb_unison_actors = ecatb.send(@last_ecatb_item.ecatb_unison_actor, self)
    @ecatb_unison_actors.collect!(&ecatb::BLOCKS[:usable?])
    if @ecatb_unison_invoker
      @ecatb_unison_rule[:charge] = ecatb.send(
      @last_ecatb_item.ecatb_unison_charge_rule, self)
      @ecatb_unison_rule[:cooldown] = ecatb.send(
      @last_ecatb_item.ecatb_unison_cooldown_rule, self)
    end
    #
    post_ecatb_input_act
    set_ecatb_battler_change
  end # confirm_ecatb_item

  def init_ecatb_escape # v0.05a+; New
    @ecatb_esc = @ecatb_item_change[:charge] = true
    @ecatb_unison_actors.clear
    @ecatb_unison_invoker = false
    @ecatb_unison_rule.clear
    BattleManager.del_ecatb_act(self)
  end # init_ecatb_escape

  def pay_ecatb_esc_cost # New
    @ecatb_act_times -= cost = ecatb_esc_act_cost
    @temp_ecatb_act_times -= cost
    @ecatb_reset_val = ecatb_esc_reset_val
    @ecatb_val[:atb] -= cost * 100.0 if @ecatb_val[:atb] > 100.0
    @ecatb_val[:charge] = 100.0
    @ecatb_esc = false
    @ecatb_item_change[:cooldown] = @fail_ecatb_esc = true
    set_ecatb_battler_change
  end # pay_ecatb_esc_cost

  def ecatb_inputable? # New; Hotspot
    return false if @ecatb_val[:charge] > 0.0 || @ecatb_val[:cooldown] > 0.0
    @ecatb_act_times > 0 && inputable? && !ecatb_reset_compatibility?
  end # ecatb_inputable?

  # actors: The unison actors
  def ecatb_unison_usable?(item, actors) # New
    return false unless item.is_a?(RPG::UsableItem) && actors.include?(self)
    # Checks if all unison actors are inputable and can use the skill/item
    return false unless (actors - BattleManager.ecatb_actor_act_list).empty?
    unless actors.all? { |actor| actor.ecatb_unison_actor?(item, actors) }
      return false
    end
    #
    ecatb_unison_skill_item_usable?(item, actors)
  end # ecatb_unison_usable?

  #----------------------------------------------------------------------------|
  #  Checks if the actor's can input the skill/item and pay its costs          |
  #----------------------------------------------------------------------------|
  # actors: The unison actors
  def ecatb_unison_actor?(item, actors) # New
    return false unless inputable?
    return false unless item.is_a?(RPG::Skill) || item_conditions_met?(item)
    return false unless skills.include?(item) || skill_conditions_met?(item)
    cost = (ecatb = DoubleX_RMVXA::ECATB).send(item.ecatb_act_cost, self)
    cost *= actors.size if $game_party.ecatb_pool
    return true if @ecatb_act_times >= cost
    return false if @ecatb_val[:charge] <= 0.0
    !ecatb.send(item.ecatb_charge_prior_act_cost, self)
  end # ecatb_unison_actor?

  #----------------------------------------------------------------------------|
  #  Checks if the unison actors can input or use the unison skill/item        |
  #----------------------------------------------------------------------------|
  # actors: The unison actors
  def ecatb_unison_skill_item_usable?(item, actors) # New
    # Checks if all unison actors are inputable or they're all charging
    input = charge = true
    actors.each { |actor|
      act = actor.current_action
      input &&= (!act || !act.item) && actor.ecatb_val[:charge] <= 0.0
      charge &&= act && act.item == item
      return false unless input || charge
    }
    #
  end # ecatb_unison_skill_item_usable?

end # Game_Actor

#------------------------------------------------------------------------------|
#  * Implements the enemy's additional atb actions, control flows and logics   |
#------------------------------------------------------------------------------|
class Game_Enemy < Game_Battler # New

  #----------------------------------------------------------------------------|
  #  New private instance variables                                            |
  #----------------------------------------------------------------------------|
  # @ecatb_bar_show: The cached atb bar part display flags with display details
  # @ecatb_state_change: The state change flags

  #----------------------------------------------------------------------------|
  #  Confirms the action and pays its now if charge prior costs are true also  |
  #----------------------------------------------------------------------------|
  alias make_actions_ecatb make_actions
  def make_actions(*argv, &argb)
    make_actions_ecatb(*argv, &argb)
    # Added
    return unless BattleManager.btype?(:ecatb)
    return unless current_action && current_action.item
    confirm_ecatb_item
    set_ecatb_speed_reduce
    #
  end # make_actions

  #----------------------------------------------------------------------------|
  #  Creates and checks the associated method for each configuration used here |
  #----------------------------------------------------------------------------|
  # config: The configuration requesting its associated method
  # validate: The configuration value validation flag
  def create_ecatb_def(config, validate = true) # New
    # Uses the name and value of configuration as its method's name and contents
    method = config.id2name
    eval(%Q(
  def #{method}#{DoubleX_RMVXA::ECATB::GAME_ENEMY[config][0]}
    #{$game_system.send(config)}
  end
    ))
    #
    return unless validate
    check_ecatb_def(method, DoubleX_RMVXA::ECATB::GAME_ENEMY[config])
  end # create_ecatb_def

  #----------------------------------------------------------------------------|
  #  Checks all new methods and resets them to the defaults if they're invalid |
  #----------------------------------------------------------------------------|
  module_eval(DoubleX_RMVXA::ECATB::CHECK_RESET_DEF[:GAME_ENEMY]) # New

  #----------------------------------------------------------------------------|
  #  Marks that the state array changed as well                                |
  #----------------------------------------------------------------------------|
  def erase_state(state_id, &argb) # New
    @ecatb_state_change = [true, true, true, true] if @states.include?(state_id)
    super(state_id, &argb)
  end # erase_state

  #----------------------------------------------------------------------------|
  #  Marks that the state array changed as well                                |
  #----------------------------------------------------------------------------|
  def clear_states(*argv, &argb) # New
    super(*argv, &argb)
    @ecatb_state_change = [true, true, true, true]
  end # clear_states

  #----------------------------------------------------------------------------|
  #  Marks that the state array changed as well                                |
  #----------------------------------------------------------------------------|
  def add_new_state(state_id, &argb) # New
    super(state_id, &argb)
    @ecatb_state_change = [true, true, true, true]
  end # add_new_state

  def init_ecatb_vars # New
    super
    @ecatb_bar_show = []
  end # init_ecatb_vars

  #----------------------------------------------------------------------------|
  #  Marks that the enemy with id being this enemy's id has been killed before |
  #----------------------------------------------------------------------------|
  def die # New
    super
    return if $game_party.ecatb_dead_enemies.include?(@enemy_id)
    $game_party.ecatb_dead_enemies << @enemy_id
  end # die

  # start: The battle start type
  def default_ecatb_start_val(start) # New
    return normal_enemy_1st_ecatb_val if start == :start_0
    return preemptive_enemy_1st_ecatb_val if start == :start_1
    surprise_enemy_1st_ecatb_val
  end # default_ecatb_start_val

  def confirm_ecatb_item # New
    super
    post_ecatb_input_act
  end # confirm_ecatb_item

  # index: The indicator of which atb bar parts queries its display flag
  def ecatb_bar_show?(index) # New; Hotspot
    # Reevaluates the atb bar part display flags only if the states changed
    if @ecatb_state_change[index]
      @ecatb_state_change[index] = @ecatb_bar_show[index] = nil
      states.each { |state|
        next if (show = state.enemy_ecatb_bar_show[index]).nil?
        return @ecatb_bar_show[index] = show
      }
    end
    #
    return @ecatb_bar_show[index] unless @ecatb_bar_show[index].nil?
    enemy.enemy_ecatb_bar_show[index]
  end # ecatb_bar_show?

end # Game_Enemy

#------------------------------------------------------------------------------|
#  * Hosts the atb pool mode flag for game party and troop                     |
#------------------------------------------------------------------------------|
class Game_Unit # Edit

  #----------------------------------------------------------------------------|
  #  New public instance variable                                              |
  #----------------------------------------------------------------------------|
  attr_accessor :ecatb_pool # The party/troop atb pool mode flag

end # Game_Unit

#------------------------------------------------------------------------------|
#  * Holds the defeated enemies, added actors and removed actors during battles|
#------------------------------------------------------------------------------|
class Game_Party < Game_Unit # Edit

  #----------------------------------------------------------------------------|
  #  New public instance variable                                              |
  #----------------------------------------------------------------------------|
  attr_accessor :ecatb_dead_enemies # The list of defeated enemies

  #----------------------------------------------------------------------------|
  #  Creates new methods of all configurations used by actors as well          |
  #----------------------------------------------------------------------------|
  alias initialize_ecatb initialize
  def initialize(*argv, &argb)
    initialize_ecatb(*argv, &argb)
    create_ecatb_defs # Added
  end # initialize

  #----------------------------------------------------------------------------|
  #  Initializes all new variables as well                                     |
  #----------------------------------------------------------------------------|
  alias init_all_items_ecatb init_all_items
  def init_all_items(*argv, &argb)
    init_all_items_ecatb(*argv, &argb)
    @ecatb_dead_enemies = [] # Added
  end # init_all_items

  #----------------------------------------------------------------------------|
  #  Notifies that an actor's added into the party as well                     |
  #----------------------------------------------------------------------------|
  alias add_actor_ecatb add_actor # v0.02b+
  def add_actor(actor_id, &argb)
    # Added
    if @in_battle && !@actors.include?(actor_id)
      $game_temp.ecatb_add_actors << $game_actors[actor_id]
    end
    #
    add_actor_ecatb(actor_id, &argb)
  end # add_actor

  #----------------------------------------------------------------------------|
  #  Notifies that an actor's removed from the party as well                   |
  #----------------------------------------------------------------------------|
  alias remove_actor_ecatb remove_actor # v0.02b+
  def remove_actor(actor_id, &argb)
    # Added
    if @in_battle && @actors.include?(actor_id)
      $game_temp.ecatb_remove_actors << $game_actors[actor_id]
    end
    #
    remove_actor_ecatb(actor_id, &argb)
  end # remove_actor

  #----------------------------------------------------------------------------|
  #  Creates and checks the associated method for each configuration used here |
  #----------------------------------------------------------------------------|
  # config: The configuration requesting its associated method
  # validate: The configuration value validation flag
  def create_ecatb_def(config, validate = true) # New
    # Uses the name and value of configuration as its method's name and contents
    method = config.id2name
    eval(%Q(
  def #{method}#{DoubleX_RMVXA::ECATB::GAME_PARTY_TROOP[config][0]}
    #{$game_system.send(config)}
  end
    ))
    #
    return unless validate
    check_ecatb_def(method, DoubleX_RMVXA::ECATB::GAME_PARTY_TROOP[config])
  end # create_ecatb_def

  #----------------------------------------------------------------------------|
  #  Checks all new methods and resets them to the defaults if they're invalid |
  #----------------------------------------------------------------------------|
  module_eval(DoubleX_RMVXA::ECATB::CHECK_RESET_DEF[:GAME_PARTY_TROOP]) # New

end # Game_Party

class Game_Troop < Game_Unit # Edit

  #----------------------------------------------------------------------------|
  #  Initializes all enemies' new variables and methods as well                |
  #----------------------------------------------------------------------------|
  alias setup_ecatb setup
  def setup(troop_id, &argb)
    setup_ecatb(troop_id, &argb)
    @enemies.each(&DoubleX_RMVXA::ECATB::BLOCKS[:create_ecatb_defs]) # Added
  end # setup

  #----------------------------------------------------------------------------|
  #  Creates and checks the associated method for each configuration used here |
  #----------------------------------------------------------------------------|
  # config: The configuration requesting its associated method
  # validate: The configuration value validation flag
  def create_ecatb_def(config, validate = true) # New
    # Uses the name and value of configuration as its method's name and contents
    method = config.id2name
    eval(%Q(
  def #{method}#{DoubleX_RMVXA::ECATB::GAME_PARTY_TROOP[config][0]}
    #{$game_system.send(config)}
  end
    ))
    #
    return unless validate
    check_ecatb_def(method, DoubleX_RMVXA::ECATB::GAME_PARTY_TROOP[config])
  end # create_ecatb_def

  #----------------------------------------------------------------------------|
  #  Checks all new methods and resets them to the defaults if they're invalid |
  #----------------------------------------------------------------------------|
  module_eval(DoubleX_RMVXA::ECATB::CHECK_RESET_DEF[:GAME_PARTY_TROOP]) # New

end # Game_Troop

#------------------------------------------------------------------------------|
#  * Hosts actor/enemy sprite atb, charge and cooldown bars                    |
#------------------------------------------------------------------------------|
class Sprite_Battler < Sprite_Base # Edit

  #----------------------------------------------------------------------------|
  #  New private instance variable                                             |
  #----------------------------------------------------------------------------|
  # @ecatb_bars: The battler's atb bars

  #----------------------------------------------------------------------------|
  #  Create all atb bars as well                                               |
  #----------------------------------------------------------------------------|
  alias initialize_ecatb initialize
  def initialize(viewport, battler = nil, &argb)
    initialize_ecatb(viewport, battler, &argb)
    # Added
    return unless BattleManager.btype?(:ecatb) && @battler
    return unless @battler.enemy? || BattleManager.actor_sprite_ecatb_bar
    create_ecatb_bars
    #
  end # initialize

  #----------------------------------------------------------------------------|
  #  Disposes all atb bars as well                                             |
  #----------------------------------------------------------------------------|
  alias dispose_ecatb dispose
  def dispose(*argv, &argb)
    dispose_ecatb(*argv, &argb)
    # Added
    return unless @ecatb_bars && BattleManager.btype?(:ecatb)
    @ecatb_bars.each_value(&DoubleX_RMVXA::ECATB::BLOCKS[:dispose])
    @ecatb_bars = nil
    #
  end # dispose

  #----------------------------------------------------------------------------|
  #  Updates all atb bars as well                                              |
  #----------------------------------------------------------------------------|
  alias update_ecatb update
  def update # Hotspot
    update_ecatb
    # Added
    return unless @ecatb_bars && BattleManager.btype?(:ecatb)
    @ecatb_bars.each_value(&DoubleX_RMVXA::ECATB::BLOCKS[:update])
    #
  end # update

  #----------------------------------------------------------------------------|
  #  Creates the back, atb, charge, color and text bars                        |
  #----------------------------------------------------------------------------|
  def create_ecatb_bars # New
    @ecatb_bars = {}
    # Uses 1 bar for each atb type if multilayer's used
    types = if @battler.ecatb_bar_multilayer
      [:back, :atb, :charge, :cooldown, :text]
    else
      [:back, :atbs, :text]
    end
    #
    types.each { |type| @ecatb_bars[type] = ECATB_Bar.new(@battler, type) }
  end # create_ecatb_bars

end # Sprite_Battler

#------------------------------------------------------------------------------|
#  * (v0.00b+)Fixes bugs and edge cases                                        |
#------------------------------------------------------------------------------|
class Spriteset_Battle # Edit

  #----------------------------------------------------------------------------|
  #  Inserts actors into the actor sprites as well                             |
  #----------------------------------------------------------------------------|
  alias create_actors_ecatb create_actors
  def create_actors(*argv, &argb)
    # Rewritten
    return create_actors_ecatb(*argv, &argb) unless BattleManager.btype?(:ecatb)
    dispose_actors if @actor_sprites
    @actor_sprites = $game_party.battle_members.reverse!.collect! { |actor|
      Sprite_Battler.new(@viewport1, actor)
    }
    #
  end # create_actors

end # Spriteset_Battle

#------------------------------------------------------------------------------|
#  * (v0.01a+)Handles the battler icons in the atb battler order window        |
#------------------------------------------------------------------------------|
class ECATB_Order_Battler_Icon < Sprite # New

  #----------------------------------------------------------------------------|
  #  Private instance variables                                                |
  #----------------------------------------------------------------------------|
  # @battler: The battler using the atb order icon
  # @icon: The battler atb order icon
  # @window: The battler atb order window

  def initialize(battler, window)
    super(SceneManager.scene.spriteset.viewport1)
    @battler = battler
    @window = window
    update
  end # initialize

  def dispose
    return if disposed?
    bitmap.dispose unless bitmap.disposed?
    super
  end # dispose

  def update # Hotspot
    return unless (self.visible = @battler.alive?) && 
    BattleManager.phase != :init
    if @icon != icon = @battler.set_ecatb_order_battler_icon
      @icon = icon.clone
      create_sprite_bitmap
    end
    update_pos
  end # update

  def create_sprite_bitmap # Potential Hotspot
    bitmap.dispose if bitmap && !bitmap.disposed?
    self.bitmap = Bitmap.new(dw = @icon[1].width, dh = @icon[1].height)
    self.ox = self.oy = 0
    scale = @battler.set_ecatb_order_battler_scale
    bitmap.stretch_blt(Rect.new(0, 0, dw * scale, dh * scale), @icon[0], 
    @icon[1], @battler.set_ecatb_order_battler_opacity)
    @icon[0].dispose unless @icon[0].disposed?
  end # create_sprite_bitmap

  #----------------------------------------------------------------------------|
  #  Updates the icon x, y and z positions if they're changed                  |
  #----------------------------------------------------------------------------|
  def update_pos # Hotspot
    # Checks the battler's atb type and updates the icon positions accordingly
    dw = @window.ecatb_order_bar_wh[0] / 3
    xyz = @window.ecatb_order_window_xyz
    dx = xyz[0] + @battler.ecatb_order_battler_icon_x
    dx += if (type = @battler.ecatb_bar_type) == :cooldown
      (100.0 - @battler.ecatb_val[type] % 100.0) / 100.0 * dw
    else
      ([@battler.ecatb_val[type], 100.0].min / 100.0 + 
      (type == :atb ? 1 : 2)) * dw
    end
    #
    self.x = dx if x != dx
    dy = xyz[1] + if @battler.actor?
      @battler.ecatb_order_actor_icon_y
    else
      @battler.ecatb_order_enemy_icon_y
    end
    self.y = dy if y != dy
    dz = @battler.set_ecatb_order_battler_z
    self.z = dz if z != dz
  end # update_pos

end # ECATB_Order_Battler_Icon

#------------------------------------------------------------------------------|
#  * Handles the actor/enemy sprite atb, charge and cooldown bars              |
#------------------------------------------------------------------------------|
class ECATB_Bar < Viewport # New

  #----------------------------------------------------------------------------|
  #  Private instance variables                                                |
  #----------------------------------------------------------------------------|
  # @battler: The battler using the atb bar
  # @last_wh: The last atb bar width and height
  # @last_text_xy_offset : The last text x and y offsets
  # @last_x: The last atb bar x position
  # @last_y: The last atb bar y position
  # @last_xy_offset: The last atb bar x and y offsets
  # @one_color: The color 1 and color 2 being the same flag
  # @outline: The atb bar outline drawing flag
  # @plane: The plane with the bitmap drawing the atb bar
  # @type: The atb bar type

  # type: The atb bar type
  def initialize(battler, type)
    init_vars(battler, type)
    create_ecatb_defs
    dw = (wh = ecatb_bar_wh)[0]
    dh = @type == :text ? ecatb_bar_text_size : wh[1]
    if @outline
      dw += 2
      dh += 2
    end
    super(Rect.new((xy = ecatb_bar_xy_offset)[0], xy[1], dw, dh))
    init_bars
  end # initialize

  # type: The atb bar type
  def init_vars(battler, type)
    @battler = battler
    @type = type
    @outline = @type == :back || @type == :text
  end # init_vars

  #----------------------------------------------------------------------------|
  #  Creates and checks the associated method for each configuration used here |
  #----------------------------------------------------------------------------|
  # config: The configuration requesting its associated method
  # validate: The configuration value validation flag
  def create_ecatb_def(config, validate = true) # v0.04f+
    # Uses the name and value of configuration as its method's name and contents
    method = config.id2name
    eval(%Q(
  def #{method}#{DoubleX_RMVXA::ECATB::ECATB_BAR[config][0]}
    #{$game_system.send(config)}
  end
    ))
    #
    return unless validate
    check_ecatb_def(method, DoubleX_RMVXA::ECATB::ECATB_BAR[config])
  end # create_ecatb_def

  #----------------------------------------------------------------------------|
  #  Checks all new methods and resets them to the defaults if they're invalid |
  #----------------------------------------------------------------------------|
  module_eval(DoubleX_RMVXA::ECATB::CHECK_RESET_DEF[:ECATB_BAR]) # v0.04f+

  def init_bars
    (@plane = Plane.new(self)).bitmap = Bitmap.new(rect.width * 2, rect.height)
    self.visible = false
    update_pos
    draw_bars
  end # init_bars

  def dispose
    return if @plane.disposed?
    @plane.bitmap.dispose if @plane.bitmap
    @plane.dispose
    super
  end # dispose

  #----------------------------------------------------------------------------|
  #  Updates the bar visibility, xy positions, width, height, color and text   |
  #----------------------------------------------------------------------------|
  def update # Hotspot
    super
    return unless self.visible = visible?
    update_pos
    unless @outline
      update_bar_w
      if @battler.ecatb_battler_change?(type = @battler.ecatb_bar_type)
        return draw_bars unless @type != type && @battler.ecatb_bar_multilayer
      end
    end
    return update_text if @type == :text
    @plane.ox -= ecatb_bar_ani_ox if @one_color && ecatb_bar_ani
  end # update

  #----------------------------------------------------------------------------|
  #  Updates the bar xy positions and height only if any of them changes       |
  #----------------------------------------------------------------------------|
  def update_pos # Hotspot
    z_pos = ecatb_bar_z
    self.z = z_pos if z != z_pos
    return unless update_pos?
    rect.width = @last_wh[0] + 2 if @outline
    rect.height = @last_wh[1] + (@outline ? 2 : 0)
    update_xy
  end # update_pos

  #----------------------------------------------------------------------------|
  #  Updates the bar and text xy positions                                     |
  #----------------------------------------------------------------------------|
  def update_xy # Hotspot
    dx = @last_x + @last_xy_offset[0] - (@last_wh[0] + (@outline ? 2 : 0)) / 2
    dy = @last_y + @last_xy_offset[1]
    if @type == :text
      dx += @last_text_xy_offset[0]
      dy += @last_text_xy_offset[1]
    end
    rect.x = dx
    dh = rect.height + (@outline ? 1 : 3)
    rect.y = dy + (@outline ? 0 : 1)
  end # update_xy

  def draw_bars
    dw = rect.width
    dh = rect.height
    @outline ? rect.width = @last_wh[0] + 2 : update_bar_w
    @one_color = (colors = set_bar_colors)[0] == colors[1]
    (bitmap = @plane.bitmap).gradient_fill_rect(0, 0, dw, dh, colors[0], 
    colors[1])
    bitmap.gradient_fill_rect(dw, 0, dw, dh, colors[1], colors[0])
  end # draw_bars

  #----------------------------------------------------------------------------|
  #  Updates the atb bar width if it's changed                                 |
  #----------------------------------------------------------------------------|
  def update_bar_w # Hotspot
    type = @battler.ecatb_bar_multilayer ? @type : @battler.ecatb_bar_type
    w = @battler.ecatb_val[type] % 100.0 * @last_wh[0] / 100.0
    rect.width = w if rect.width != w
  end # update_bar_w

  def set_bar_colors
    return ecatb_bar_back_colors if @type == :back
    return [Color.new(0, 0, 0, 0), Color.new(0, 0, 0, 0)] if @type == :text
    type = @battler.ecatb_bar_multilayer ? @type : @battler.ecatb_bar_type
    @battler.set_ecatb_bar_colors(type)
    @battler.ecatb_notes[type]
  end # set_bar_colors

  #----------------------------------------------------------------------------|
  #  Redraws the atb bar texts only if its contents and/or fonts changed       |
  #----------------------------------------------------------------------------|
  def update_text # Hotspot
    text = ecatb_bar_text((text = set_text)[0], text[1])
    return unless update_text_font? || @last_text != text
    @last_text = text
    return self.visible = false if text.empty?
    self.visible = true
    dw = (bitmap = @plane.bitmap).text_size(text).width
    bitmap.clear
    bitmap.draw_text(@last_wh[0] + 2 - dw, 0, dw, 
    bitmap.text_size(text).height, text)
  end # update_text

  #----------------------------------------------------------------------------|
  #  Sets the atb bar fill percent and action point text if they're to be shown|
  #----------------------------------------------------------------------------|
  def set_text # Hotspot
    [@battler.actor? || @battler.ecatb_bar_show?(2) ? 
     @battler.ecatb_val[@battler.ecatb_bar_type].to_i.to_s : "", 
     @battler.actor? || @battler.ecatb_bar_show?(3) ? 
     @battler.ecatb_act_times.to_s : ""]
  end # set_text

  #----------------------------------------------------------------------------|
  #  Checks if the atb bars and text should be visible                         |
  #----------------------------------------------------------------------------|
  def visible? # Hotspot
    # Checks if the battler's alive and the enemy's bars should be shown
    return false if $game_party.all_dead? || $game_troop.all_dead?
    return @battler.alive? if @battler.actor?
    return false unless @battler.alive? && @battler.ecatb_bar_show?(1)
    return true unless @battler.ecatb_bar_show?(0)
    $game_party.ecatb_dead_enemies.include?(@battler.enemy_id)
    #
  end # visible?

  #----------------------------------------------------------------------------|
  #  Checks if the atb bar and text positions need to be updated               |
  #----------------------------------------------------------------------------|
  def update_pos? # Hotspot
    # Checks if the bar width, height, offset or battler x or y position changes
    dx = @battler.screen_x
    dy = @battler.screen_y
    xy_offset = ecatb_bar_xy_offset
    same_pos = @last_wh == (wh = ecatb_bar_wh) && @last_x == dx && 
    @last_y == dy && @last_xy_offset == xy_offset
    return false if @type != :text && same_pos
    if @type == :text
      text_xy_offset = ecatb_bar_text_xy_offset
      return false if same_pos && @last_text_xy_offset == text_xy_offset
      @last_text_xy_offset = text_xy_offset.clone
    end
    @last_wh = wh.clone
    @last_x = dx
    @last_y = dy
    @last_xy_offset = xy_offset
    #
  end # update_pos?

  #----------------------------------------------------------------------------|
  #  Checks if the atb bar text color and size's changed and updates them if so|
  #----------------------------------------------------------------------------|
  def update_text_font? # Hotspot
    change = false
    if (font = @plane.bitmap.font).color != color = ecatb_bar_text_color
      change = font.color = color 
    end
    size = ecatb_bar_text_size
    change = font.size = size if font.size != size
    change
    #
  end # update_text_font?

end # ECATB_Bar

#------------------------------------------------------------------------------|
#  * Handles the battle atb clock bar in battle atb clock and turn window      |
#------------------------------------------------------------------------------|
class ECATB_Clock_Bar < Viewport # New

  #----------------------------------------------------------------------------|
  #  Private instance variables                                                |
  #----------------------------------------------------------------------------|
  # @last_w: Stores the last width of the atb clock bar
  # @plane: Stores the plane with the bitmap drawing the atb clock bar

  def initialize
    create_ecatb_defs
    xy = ecatb_clock_bar_xy
    rect = Rect.new(xy[0], xy[1], (wh = ecatb_clock_bar_wh)[0], wh[1])
    super(rect)
    create_bars
    update_bar_wh
    update_bar_xy
  end # initialize

  #----------------------------------------------------------------------------|
  #  Creates and checks the associated method for each configuration used here |
  #----------------------------------------------------------------------------|
  # config: The configuration requesting its associated method
  # validate: The configuration value validation flag
  def create_ecatb_def(config, validate = true) # New
    # Uses the name and value of configuration as its method's name and contents
    method = config.id2name
    eval(%Q(
  def #{method}#{DoubleX_RMVXA::ECATB::ECATB_CLOCK_BAR[config][0]}
    #{$game_system.send(config)}
  end
    ))
    #
    return unless validate
    check_ecatb_def(method, DoubleX_RMVXA::ECATB::ECATB_CLOCK_BAR[config])
  end # create_ecatb_def

  #----------------------------------------------------------------------------|
  #  Checks all new methods and resets them to the defaults if they're invalid |
  #----------------------------------------------------------------------------|
  module_eval(DoubleX_RMVXA::ECATB::CHECK_RESET_DEF[:ECATB_CLOCK_BAR]) # New

  def dispose
    return if @plane.disposed?
    @plane.bitmap.dispose if @plane.bitmap
    @plane.dispose
    super
  end # dispose

  def create_bars
    (@plane = Plane.new(self)).bitmap = Bitmap.new(rect.width * 2, rect.height)
    update_bar_colors
    self.visible = true
  end # create_bars

  def update_bar_colors # Potential Hotspot
    @plane.bitmap.gradient_fill_rect(0, 0, rect.width, rect.height, 
    (colors = ecatb_clock_bar_colors)[0], colors[1])
    rect.width = 0
  end # update_bar_colors

  #----------------------------------------------------------------------------|
  #  Updates the atb clock window bar width and height only if they've changed |
  #----------------------------------------------------------------------------|
  def update_bar_wh # Potential Hotspot
    wh = ecatb_clock_bar_wh
    rect.width = @last_w = wh[0] if @last_w != wh[0]
    rect.height = wh[1] if rect.height != wh[1]
  end # update_bar_wh

  #----------------------------------------------------------------------------|
  #  Updates the atb clock window bar xy positions only if they've changed     |
  #----------------------------------------------------------------------------|
  def update_bar_xy # Potential Hotspot
    xy = ecatb_clock_bar_xy
    rect.x = xy[0] if rect.x != xy[0]
    rect.y = xy[1] if rect.y != xy[1]
  end # update_bar_xy

  #----------------------------------------------------------------------------|
  #  Updates the atb clock window bar length only if it needs to change        |
  #----------------------------------------------------------------------------|
  # cur_clock: The number of frames passed in the current turn
  # max_clock: The number of frames of the current turn
  def update_bar(cur_clock, max_clock) # Hotspot
    update
    w = @last_w * 1.0 * cur_clock / max_clock
    rect.width = w if rect.width != w
  end # update_bar

end # ECATB_Clock_Bar

#------------------------------------------------------------------------------|
#  * Fixes bugs and edge cases                                                 |
#------------------------------------------------------------------------------|
class Window_ItemList < Window_Selectable # Edit

  #----------------------------------------------------------------------------|
  #  Disables items in battles when the user doesn't have enough action points |
  #----------------------------------------------------------------------------|
  alias enable_ecatb? enable?
  def enable?(item)
    # Added
    if SceneManager.scene_is?(Scene_Battle) && item && item.is_a?(RPG::Item)
      if BattleManager.btype?(:ecatb)
        battler = BattleManager.actor
        return battler.usable?(item) if (ecatb = DoubleX_RMVXA::ECATB).send(
        item.ecatb_act_cost, battler) > 1 || ecatb.send(
        item.ecatb_unison_actor, battler).size > 1
      end
    end
    #
    enable_ecatb?(item)
  end # enable?

end # Window_ItemList

#------------------------------------------------------------------------------|
#  * Fixes bugs and edge cases                                                 |
#------------------------------------------------------------------------------|
class Window_EquipItem < Window_ItemList # v0.02d+; Edit

  #----------------------------------------------------------------------------|
  #  Clears and resets all blocks of the actor before and after serialization  |
  #----------------------------------------------------------------------------|
  alias update_help_ecatb update_help
  def update_help
    @actor.clear_ecatb_blocks # Added
    update_help_ecatb
    @actor.reset_ecatb_blocks if SceneManager.scene_is?(Scene_Battle) # Added
  end # update_help

end # Window_EquipItem

#------------------------------------------------------------------------------|
#  * Shows all unison actors' names when executing an unison skill/item        |
#------------------------------------------------------------------------------|
class Window_BattleLog < Window_Selectable # Edit

  #----------------------------------------------------------------------------|
  #  Displays all unison actors' names if they're all to be shown as well      |
  #----------------------------------------------------------------------------|
  alias display_use_item_ecatb display_use_item
  def display_use_item(subject, item, &argb)
    # Added
    if BattleManager.btype?(:ecatb) && subject.show_ecatb_unison_battlers
      if subject.ecatb_unison_actors.size > 1
        return display_ecatb_unison_item(item, subject.ecatb_unison_actors)
      end
    end
    #
    display_use_item_ecatb(subject, item, &argb)
  end # display_use_item

  # actors: The unison actors
  def display_ecatb_unison_item(item, actors) # New
    battler_names = ecatb_unison_battler_names(actors)
    unless item.is_a?(RPG::Skill)
      return add_text(sprintf(Vocab::UseItem, battler_names, item.name))
    end
    add_text(battler_names + item.message1)
    return if item.message2.empty?
    wait
    add_text(item.message2)
  end # display_use_item

  # actors: The unison actors
  def ecatb_unison_battler_names(actors) # New
    names = ""
    max_index = actors.size - 1
    actors.each_with_index { |actor, index|
      (names += index < max_index ? ", " : " and ") if index > 0
      names += actor.name
    }
    names
  end # ecatb_unison_battler_names

end # Window_BattleLog

#------------------------------------------------------------------------------|
#  * Adds actor selection hotkeys and lets directional commands cycle          |
#------------------------------------------------------------------------------|
class Window_ActorCommand < Window_Command # Edit

  #----------------------------------------------------------------------------|
  #  New private instance variable                                             |
  #----------------------------------------------------------------------------|
  # @ecatb_hotkey_block: The hotkey handling block

  #----------------------------------------------------------------------------|
  #  Initializes the new block used by process_handling as well                |
  #----------------------------------------------------------------------------|
  alias initialize_ecatb initialize
  def initialize(*argv, &argb)
    initialize_ecatb(*argv, &argb)
    init_ecatb_block # Added
  end # initialize

  #----------------------------------------------------------------------------|
  #  Set left arrow output as switching to prior actor in ecatb battle system  |
  #----------------------------------------------------------------------------|
  alias process_dir4_ecatb process_dir4
  def process_dir4 # Potential Hotspot
    return process_dir4_ecatb unless BattleManager.btype?(:ecatb) # Rewritten
    # Added
    Sound.play_cursor
    Input.update
    deactivate
    call_handler(:dir4)
    #
  end # process_dir4

  #----------------------------------------------------------------------------|
  #  Calls the hotkey handler methods if the hotkey's pressed                  |
  #----------------------------------------------------------------------------|
  module_eval(DoubleX_RMVXA::ECATB::ACTOR_HOTKEY) # Alias; Hotspot

  #----------------------------------------------------------------------------|
  #  Initializes the new block to trade memory usage for time performance      |
  #----------------------------------------------------------------------------|
  def init_ecatb_block # New
    # Calls this block instead of an anonymous function per enumerable iteration
    @ecatb_hotkey_block = 
    -> hotkey { return call_handler(hotkey) if Input.trigger?(hotkey) }
    #
  end # init_ecatb_block

end # Window_ActorCommand

#------------------------------------------------------------------------------|
#  * Draws the atb, charge and cooldown bars of all actors                     |
#------------------------------------------------------------------------------|
class Window_BattleStatus < Window_Selectable # New

  #----------------------------------------------------------------------------|
  #  (v0.04f+)New public instance variables                                    |
  #----------------------------------------------------------------------------|
  attr_writer :ecatb_text_change # The atb bar text format change notifier
  attr_writer :ecatb_word_change # The atb bar description change notifier
  attr_writer :ecatb_y_add_change # The atb bar y offset change notifier

  #----------------------------------------------------------------------------|
  #  New private instance variables                                            |
  #----------------------------------------------------------------------------|
  # @ecatb_draw_bars: The atb bar drawing iteartor block
  # @last_ecatb_text: The last atb bar fill percentage and action point text
  # @last_ecatb_w: The last atb bar width

  #----------------------------------------------------------------------------|
  #  Initializes all new methods and block as well                             |
  #----------------------------------------------------------------------------|
  alias initialize_ecatb initialize
  def initialize(*argv, &argb)
    initialize_ecatb(*argv, &argb)
    # Added
    create_ecatb_defs
    @last_ecatb_text = {}
    @last_ecatb_w = {}
    init_ecatb_block
    #
  end # initialize

  #----------------------------------------------------------------------------|
  #  Redraws the atb bar and text if the battle started as well                |
  #----------------------------------------------------------------------------|
  alias draw_item_ecatb draw_item
  def draw_item(index, &argb) # Potential Hotspot
    draw_item_ecatb(index, &argb)
    # Added
    return if BattleManager.phase == :init
    return unless index && BattleManager.btype?(:ecatb)
    set_ecatb_bar(index, true) unless BattleManager.actor_sprite_ecatb_bar
    #
  end # draw_item

  #----------------------------------------------------------------------------|
  #  Creates and checks the associated method for each configuration used here |
  #----------------------------------------------------------------------------|
  # config: The configuration requesting its associated method
  # validate: The configuration value validation flag
  def create_ecatb_def(config, validate = true) # New
    # Uses the name and value of configuration as its method's name and contents
    method = config.id2name
    eval(%Q(
  def #{method}#{DoubleX_RMVXA::ECATB::WINDOW_BATTLESTATUS[config][0]}
    #{$game_system.send(config)}
  end
    ))
    #
    return unless validate
    check_ecatb_def(method, DoubleX_RMVXA::ECATB::WINDOW_BATTLESTATUS[config])
  end # create_ecatb_def

  #----------------------------------------------------------------------------|
  #  Checks all new methods and resets them to the defaults if they're invalid |
  #----------------------------------------------------------------------------|
  module_eval(DoubleX_RMVXA::ECATB::CHECK_RESET_DEF[:WINDOW_BATTLESTATUS]) # New

  #----------------------------------------------------------------------------|
  #  Initializes the new block to trade memory usage for time performance      |
  #----------------------------------------------------------------------------|
  def init_ecatb_block # New
    # Calls this block instead of an anonymous function per enumerable iteration
    @ecatb_draw_bars = -> index { set_ecatb_bar(index) }
    #
  end # init_ecatb_block

  def ecatb_bar_refresh # New; Hotspot
    item_max.times(&@ecatb_draw_bars)
  end # ecatb_bar_refresh

  #----------------------------------------------------------------------------|
  #  Sets the color, length, width and y position of the actor's atb bar       |
  #----------------------------------------------------------------------------|
  # redrawn: The status window redrawn flag
  def set_ecatb_bar(index, redrawn = false) # New; Hotspot
    return if $game_troop.all_dead?
    return unless actor = $game_party.battle_members[index]
    battler_change = actor.ecatb_battler_change?(type = actor.ecatb_bar_type)
    # Redraws atb bar and text only if they're changed or window's redrawn
    return unless draw_ecatb_bar?(actor, redrawn, type, battler_change)
    draw_ecatb_bar(actor, (rect = item_rect(index)).x + 2, line_height + 
    YEA::BATTLE::BATTLESTATUS_HPGAUGE_Y_PLUS + actor_ecatb_bar_y_add, 
    rect.width - 4, actor.ecatb_bar_type, battler_change)
    #
  end # set_ecatb_bar

  #----------------------------------------------------------------------------|
  #  Draws the actor's atb bar with its description and details text           |
  #----------------------------------------------------------------------------|
  # type: The atb bar type to be drawn
  # change: The atb bar color change flag
  def draw_ecatb_bar(actor, dx, dy, width, type, change) # New; Hotspot
    actor.set_ecatb_bar_colors(type) if change
    draw_gauge(dx, dy, width, actor.ecatb_val[type] % 100.0 / 100.0, 
    (colors = actor.ecatb_notes[type])[0], colors[1])
    change_color(system_color)
    draw_text(dx + 2, dy + (Font.default_size - contents.font.size) / 2 + 1, 
    30, line_height, actor_ecatb_bar_word)
    return if @last_ecatb_text[actor].empty?
    draw_ecatb_text(actor, dx, dy, width, type)
  end # draw_ecatb_bar

  # type: The atb bar type to be drawn
  def draw_ecatb_text(actor, dx, dy, width, type) # New; Hotspot
    dw = text_size(text = actor_ecatb_bar_text(@last_ecatb_text[actor][0], 
    @last_ecatb_text[actor][1])).width + 2
    draw_text(dx + width - dw, dy + (Font.default_size - contents.font.size) / 
    2 + 1, dw, line_height, text)
  end # draw_ecatb_text

  # redrawn: The status window redrawn flag
  def draw_ecatb_bar?(actor, redrawn, type, battler_change) # v0.04f+; New; 
  # Hotspot
    w_change = @last_ecatb_w[actor] != @last_ecatb_w[actor] = 
    actor.ecatb_val[type] % 100.0 * (item_rect(index).width - 4) / 100.0
    text_change = @last_ecatb_text[actor] != @last_ecatb_text[actor] = [
    actor.ecatb_val[type].to_i.to_s, actor.ecatb_act_times.to_s]
    # Lets users notifies that the atb bar text format's changed instead
    return false unless redrawn || battler_change || w_change || text_change || 
    @ecatb_text_change || @ecatb_word_change || @ecatb_y_add_change
    !(@ecatb_text_change = @ecatb_word_change = @ecatb_y_add_change = false)
    #
  end # set_ecatb_bar

end # Window_BattleStatus

#------------------------------------------------------------------------------|
#  * Adds actor selection hotkeys and lets directional commands cycle          |
#------------------------------------------------------------------------------|
class Window_BattleActor < Window_BattleStatus # Edit

  #----------------------------------------------------------------------------|
  #  New private instance variable                                             |
  #----------------------------------------------------------------------------|
  # @ecatb_hotkey_block: The hotkey handling block

  #----------------------------------------------------------------------------|
  #  Always allow cyclic directional navigations in the ecatb battle system    |
  #----------------------------------------------------------------------------|
  alias horizontal_ecatb? horizontal?
  def horizontal? # Hotspot
    BattleManager.btype?(:ecatb) || horizontal_ecatb? # Rewritten
  end # horizontal?

  #----------------------------------------------------------------------------|
  #  Always allow cyclic directional navigations in the ecatb battle system    |
  #----------------------------------------------------------------------------|
  alias cursor_right_ecatb cursor_right
  def cursor_right(wrap = false) # Hotspot
    cursor_right_ecatb(wrap || BattleManager.btype?(:ecatb)) # Rewritten
  end # cursor_right

  #----------------------------------------------------------------------------|
  #  Always allow cyclic directional navigations in the ecatb battle system    |
  #----------------------------------------------------------------------------|
  alias cursor_left_ecatb cursor_left
  def cursor_left(wrap = false) # Hotspot
    cursor_left_ecatb(wrap || BattleManager.btype?(:ecatb)) # Rewritten
  end # cursor_left

  #----------------------------------------------------------------------------|
  #  Calls the hotkey handler methods if the hotkey's pressed                  |
  #----------------------------------------------------------------------------|
  module_eval(DoubleX_RMVXA::ECATB::ACTOR_HOTKEY) # Alias; Hotspot

  #----------------------------------------------------------------------------|
  #  Initializes the new block to trade memory usage for time performance      |
  #----------------------------------------------------------------------------|
  def init_ecatb_block # New
    super
    # Calls this block instead of an anonymous function per enumerable iteration
    @ecatb_hotkey_block = 
    -> hotkey { return call_handler(hotkey) if Input.trigger?(hotkey) }
    #
  end # init_ecatb_block

end # Window_BattleActor

#------------------------------------------------------------------------------|
#  * Adds enemy selection hotkeys and fixes bugs and edge cases                |
#------------------------------------------------------------------------------|
class Window_BattleEnemy < Window_Selectable # Edit

  #----------------------------------------------------------------------------|
  #  New private instance variable                                             |
  #----------------------------------------------------------------------------|
  # @ecatb_hotkey_block: The hotkey handling block

  #----------------------------------------------------------------------------|
  #  Updates only when the enemies has changed                                 |
  #----------------------------------------------------------------------------|
  def update # Rewrite; Hotspot
    super
    # Added
    return unless active && (!BattleManager.btype?(:ecatb) || ecatb_update?)
    #
    return enemy.sprite_effect_type = :whiten unless select_all?
    @data.each(&DoubleX_RMVXA::ECATB::BLOCKS[:window_battleenemy_update])
  end # update

  #----------------------------------------------------------------------------|
  #  Initializes the new block used by process_handling as well                |
  #----------------------------------------------------------------------------|
  alias initialize_ecatb initialize # v0.04d+
  def initialize(info_viewport, &argb)
    initialize_ecatb(info_viewport, &argb)
    init_ecatb_block # Added
  end # initialize

  #----------------------------------------------------------------------------|
  #  Prevents division by 0 error                                              |
  #----------------------------------------------------------------------------|
  alias col_max_ecatb col_max
  def col_max # Hotspot
    # Added
    return ((max = col_max_ecatb) < 1 ? 1 : max) if BattleManager.btype?(:ecatb)
    #
    col_max_ecatb
  end # col_max

  #----------------------------------------------------------------------------|
  #  Calls the hotkey handler methods if the hotkey's pressed                  |
  #----------------------------------------------------------------------------|
  module_eval(DoubleX_RMVXA::ECATB::ACTOR_HOTKEY) # v0.04d+; Alias; Hotspot

  #----------------------------------------------------------------------------|
  #  Checks if the enemies has changed and updates their data accordingly      |
  #----------------------------------------------------------------------------|
  def ecatb_update? # New; Hotspot
    return false if (alive_members = $game_troop.alive_members).empty?
    if @data.size != alive_members.size
      @data = alive_members
      @data.sort!(&DoubleX_RMVXA::ECATB::BLOCKS[:sort_screen_x])
      @index = @data.size - 1 if @index >= @data.size
    end
    true
  end # ecatb_update?

  #----------------------------------------------------------------------------|
  #  Initializes the new block to trade memory usage for time performance      |
  #----------------------------------------------------------------------------|
  def init_ecatb_block # v0.04d+; New
    # Calls this block instead of an anonymous function per enumerable iteration
    @ecatb_hotkey_block = 
    -> hotkey { return call_handler(hotkey) if Input.trigger?(hotkey) }
    #
  end # init_ecatb_block

end # Window_BattleEnemy

#------------------------------------------------------------------------------|
#  * Fixes bugs and edge cases                                                 |
#------------------------------------------------------------------------------|
class Window_BattleHelp < Window_Help # v0.04a+; Edit

  #----------------------------------------------------------------------------|
  #  Only lets valid battlers have their names retrieved                       |
  #----------------------------------------------------------------------------|
  alias battler_name_ecatb battler_name
  def battler_name(battler) # Hotspot
    battler ? battler_name_ecatb(battler) : nil # Rewritten
  end # battler_name

  alias refresh_battler_name_ecatb refresh_battler_name
  def refresh_battler_name(battler) # v0.05a+; Hotspot
    refresh_battler_name_ecatb(battler) if battler # Rewritten
  end # refresh_battler_name

end # Window_BattleHelp

#------------------------------------------------------------------------------|
#  * Handles the battle atb clock and turn number window                       |
#------------------------------------------------------------------------------|
class ECATB_Clock_Window < Window_Base # New

  #----------------------------------------------------------------------------|
  #  Public instance variables                                                 |
  #----------------------------------------------------------------------------|
  attr_reader :clock_bar # The atb clock bar
  attr_writer :cur_clock # The current atb clock
  attr_writer :max_clock # The atb clock maximum

  #----------------------------------------------------------------------------|
  #  Private instance variables                                                |
  #----------------------------------------------------------------------------|
  # @last_text_x: The last text x position
  # @last_text_y: The last text y position

  # cur_clock: The number of frames passed in the current turn
  # max_clock: The number of frames of the current turn
  def initialize(cur_clock, max_clock)
    create_ecatb_defs
    xyz = ecatb_clock_window_xyz
    super(xyz[0], xyz[1], (wh = ecatb_clock_window_wh)[0], wh[1])
    self.z = xyz[2]
    @clock_bar = ECATB_Clock_Bar.new
    @cur_clock = cur_clock
    @max_clock = max_clock
    update_text_font
    update_text_xy
    refresh
  end # initialize

  #----------------------------------------------------------------------------|
  #  Creates and checks the associated method for each configuration used here |
  #----------------------------------------------------------------------------|
  # config: The configuration requesting its associated method
  # validate: The configuration value validation flag
  def create_ecatb_def(config, validate = true) # New
    # Uses the name and value of configuration as its method's name and contents
    method = config.id2name
    eval(%Q(
  def #{method}#{DoubleX_RMVXA::ECATB::ECATB_CLOCK_WINDOW[config][0]}
    #{$game_system.send(config)}
  end
    ))
    #
    return unless validate
    check_ecatb_def(method, DoubleX_RMVXA::ECATB::ECATB_CLOCK_WINDOW[config])
  end # create_ecatb_def

  #----------------------------------------------------------------------------|
  #  Checks all new methods and resets them to the defaults if they're invalid |
  #----------------------------------------------------------------------------|
  module_eval(DoubleX_RMVXA::ECATB::CHECK_RESET_DEF[:ECATB_CLOCK_WINDOW])

  def dispose
    @clock_bar.dispose if @clock_bar
    super
  end # dispose

  #----------------------------------------------------------------------------|
  #  Updates the window positions, width and height, and text font             |
  #----------------------------------------------------------------------------|
  module_eval(DoubleX_RMVXA::ECATB::WINDOW_DEFS[:clock])

  #----------------------------------------------------------------------------|
  #  Updates the atb clock text x and y positions only if they change          |
  #----------------------------------------------------------------------------|
  def update_text_xy # Potential Hotspot
    xy = ecatb_clock_text_xy
    @last_text_x = xy[0] if @last_text_x != xy[0]
    @last_text_y = xy[1] if @last_text_y != xy[1]
  end # update_text_xy

  #----------------------------------------------------------------------------|
  #  Refreshes the atb clock window bar and text                               |
  #----------------------------------------------------------------------------|
  def refresh # Hotspot
    contents.clear
    @clock_bar.update_bar(@cur_clock, @max_clock)
	  draw_text(@last_text_x, @last_text_y, contents.width, contents.height, 
    ecatb_clock_text(@cur_clock, @max_clock, $game_troop.turn_count), 0)
  end # refresh

end # ECATB_Clock_Window

#------------------------------------------------------------------------------|
#  * Handles the atb force status window                                       |
#------------------------------------------------------------------------------|
class ECATB_Force_Window < Window_Base # New

  #----------------------------------------------------------------------------|
  #  Private instance variables                                                |
  #----------------------------------------------------------------------------|
  # @last_text_x: The last text x position
  # @last_text_y: The last text y position

  # force: The atb force status
  def initialize(force)
    create_ecatb_defs
    xyz = ecatb_force_window_xyz
    super(xyz[0], xyz[1], (wh = ecatb_force_window_wh)[0], wh[1])
    self.z = xyz[2]
    update_text_font
    update_text_xy
    draw_text(force ||= :nil)
  end # initialize

  #----------------------------------------------------------------------------|
  #  Creates and checks the associated method for each configuration used here |
  #----------------------------------------------------------------------------|
  # config: The configuration requesting its associated method
  # validate: The configuration value validation flag
  def create_ecatb_def(config, validate = true) # New
    # Uses the name and value of configuration as its method's name and contents
    method = config.id2name
    eval(%Q(
  def #{method}#{DoubleX_RMVXA::ECATB::ECATB_FORCE_WINDOW[config][0]}
    #{$game_system.send(config)}
  end
    ))
    #
    return unless validate
    check_ecatb_def(method, DoubleX_RMVXA::ECATB::ECATB_FORCE_WINDOW[config])
  end # create_ecatb_def

  #----------------------------------------------------------------------------|
  #  Checks all new methods and resets them to the defaults if they're invalid |
  #----------------------------------------------------------------------------|
  module_eval(DoubleX_RMVXA::ECATB::CHECK_RESET_DEF[:ECATB_FORCE_WINDOW])

  #----------------------------------------------------------------------------|
  #  Updates the window positions, width and height, and text font             |
  #----------------------------------------------------------------------------|
  module_eval(DoubleX_RMVXA::ECATB::WINDOW_DEFS[:force])

  #----------------------------------------------------------------------------|
  #  Updates the atb force text x and y positions only if they change          |
  #----------------------------------------------------------------------------|
  def update_text_xy # Potential Hotspot
    xy = ecatb_force_text_xy
    @last_text_x = xy[0] if @last_text_x != xy[0]
    @last_text_y = xy[1] if @last_text_y != xy[1]
  end # update_text_xy

  # force: The atb force status
  def draw_text(force)
    contents.clear
    text = if force == :nil
      ecatb_force_nil_text
    elsif force == :run
      ecatb_force_run_text
    else
      ecatb_force_stop_text
    end
	  super(@last_text_x, @last_text_y, contents.width, contents.height, text, 0)
  end # draw_text

end # ECATB_Force_Window

#------------------------------------------------------------------------------|
#  * Handles the atb battler icon order window                                 |
#------------------------------------------------------------------------------|
class ECATB_Order_Window < Window_Base # v0.01a+; New

  #----------------------------------------------------------------------------|
  #  Private instance variable                                                 |
  #----------------------------------------------------------------------------|
  # @battler_icons: All atb order battler icons

  def initialize
    create_ecatb_defs
    xyz = ecatb_order_window_xyz
    super(xyz[0], xyz[1], (wh = ecatb_order_window_wh)[0], wh[1])
    self.z = xyz[2]
    draw_bars
    @battler_icons = {}
    ($game_party.all_members + $game_troop.members).each { |mem|
      @battler_icons[mem] = ECATB_Order_Battler_Icon.new(mem, self)
    }
  end # initialize

  #----------------------------------------------------------------------------|
  #  Creates and checks the associated method for each configuration used here |
  #----------------------------------------------------------------------------|
  # config: The configuration requesting its associated method
  # validate: The configuration value validation flag
  def create_ecatb_def(config, validate = true) # New
    # Uses the name and value of configuration as its method's name and contents
    method = config.id2name
    eval(%Q(
  def #{method}#{DoubleX_RMVXA::ECATB::ECATB_ORDER_WINDOW[config][0]}
    #{$game_system.send(config)}
  end
    ))
    #
    return unless validate
    check_ecatb_def(method, DoubleX_RMVXA::ECATB::ECATB_ORDER_WINDOW[config])
  end # create_ecatb_def

  #----------------------------------------------------------------------------|
  #  Checks all new methods and resets them to the defaults if they're invalid |
  #----------------------------------------------------------------------------|
  module_eval(DoubleX_RMVXA::ECATB::CHECK_RESET_DEF[:ECATB_ORDER_WINDOW])

  def dispose
    @battler_icons.each_value(&DoubleX_RMVXA::ECATB::BLOCKS[:dispose])
    super
  end # dispose

  #----------------------------------------------------------------------------|
  #  Updates the window positions, width and height, and text font             |
  #----------------------------------------------------------------------------|
  module_eval(DoubleX_RMVXA::ECATB::WINDOW_DEFS[:order])

  #----------------------------------------------------------------------------|
  #  Adding and removing some battler icons as well as updating existing ones  |
  #----------------------------------------------------------------------------|
  def update_battler_icons # Hotspot
    update_battler_icon_list
    @battler_icons.each_value(&DoubleX_RMVXA::ECATB::BLOCKS[:update])
  end # update_battler_icons

  #----------------------------------------------------------------------------|
  #  Updates the list of battlers having icons showing the orders              |
  #----------------------------------------------------------------------------|
  def update_battler_icon_list # v0.02b+; Hotspot
    # Creates and delete icons for newly added and removed battlers respectively
    unless (actors = $game_temp.ecatb_add_actors).empty?
      $game_temp.ecatb_add_actors.clear
      actors.each { |actor|
        @battler_icons[actor] ||= ECATB_Order_Battler_Icon.new(actor, self)
      }
    end
    return if (actors = $game_temp.ecatb_remove_actors).empty?
    $game_temp.ecatb_remove_actors.clear
    actors.each { |a| @battler_icons[a].dispose if @battler_icons[a] }
    #
  end # update_battler_icon_list

  #----------------------------------------------------------------------------|
  #  Draws the cooldown, atb and charge bars  from the left to the right       |
  #----------------------------------------------------------------------------|
  def draw_bars # Potential Hotspot
    color = ecatb_order_cooldown_bar_colors
    contents.gradient_fill_rect((xy = ecatb_order_bar_xy)[0], xy[1], 
    (wh = ecatb_order_bar_wh)[0] / 3, wh[1], color[0], color[1])
    contents.gradient_fill_rect(xy[0] + wh[0] / 3, xy[1], wh[0] / 3, wh[1], 
    (color = ecatb_order_bar_colors)[0], color[1])
    contents.gradient_fill_rect(xy[0] + wh[0] * 2 / 3, xy[1], wh[0] / 3, wh[1], 
    (color = ecatb_order_charge_bar_colors)[0], color[1])
    draw_texts(wh[0] / 3)
  end # draw_bars

  #----------------------------------------------------------------------------|
  #  Draws the cooldown, atb and charge texts from the left to the right       |
  #----------------------------------------------------------------------------|
  # dw: The maximum cooldown, atb and charge text width
  def draw_texts(dw) # Potential Hotspot
    update_text_font
    wh = text_size(text = ecatb_order_cooldown_bar_text)
    xy = ecatb_order_text_xy
    draw_text(xy[0], xy[1], wh.width + 2, wh.height, text)
    wh = text_size(text = ecatb_order_bar_text)
    draw_text(xy[0] + dw, xy[1], wh.width + 2, wh.height, text)
    wh = text_size(text = ecatb_order_charge_bar_text)
    draw_text(xy[0] + dw * 2, xy[1], wh.width + 2, wh.height, text)
  end # draw_texts

end # ECATB_Order_Window

#------------------------------------------------------------------------------|
#  * Handles the pool atb mode window                                          |
#------------------------------------------------------------------------------|
class ECATB_Pool_Window < Window_Base # New

  #----------------------------------------------------------------------------|
  #  Private instance variables                                                |
  #----------------------------------------------------------------------------|
  # @last_party_x: The last party pool text x position
  # @last_party_y: The last party pool text y position
  # @last_troop_x: The last troop pool text x position
  # @last_troop_y: The last troop pool text y position

  def initialize
    create_ecatb_defs
    xyz = ecatb_pool_window_xyz
    super(xyz[0], xyz[1], (wh = ecatb_pool_window_wh)[0], wh[1])
    self.z = xyz[2]
    update_text_font
    update_text_xy
    draw_text
  end # initialize

  #----------------------------------------------------------------------------|
  #  Creates and checks the associated method for each configuration used here |
  #----------------------------------------------------------------------------|
  # config: The configuration requesting its associated method
  # validate: The configuration value validation flag
  def create_ecatb_def(config, validate = true) # New
    # Uses the name and value of configuration as its method's name and contents
    method = config.id2name
    eval(%Q(
  def #{method}#{DoubleX_RMVXA::ECATB::ECATB_POOL_WINDOW[config][0]}
    #{$game_system.send(config)}
  end
    ))
    #
    return unless validate
    check_ecatb_def(method, DoubleX_RMVXA::ECATB::ECATB_POOL_WINDOW[config])
  end # create_ecatb_def

  #----------------------------------------------------------------------------|
  #  Checks all new methods and resets them to the defaults if they're invalid |
  #----------------------------------------------------------------------------|
  module_eval(DoubleX_RMVXA::ECATB::CHECK_RESET_DEF[:ECATB_POOL_WINDOW])

  #----------------------------------------------------------------------------|
  #  Updates the window positions, width and height, and text font             |
  #----------------------------------------------------------------------------|
  module_eval(DoubleX_RMVXA::ECATB::WINDOW_DEFS[:pool])

  #----------------------------------------------------------------------------|
  #  Updates party and troop atb pool mode text x, y positions if they change  |
  #----------------------------------------------------------------------------|
  def update_text_xy # Potential Hotspot
    xy = ecatb_pool_party_text_xy
    @last_party_x = xy[0] if @last_party_x != xy[0]
    @last_party_y = xy[1] if @last_party_y != xy[1]
    xy = ecatb_pool_troop_text_xy
    @last_troop_x = xy[0] if @last_troop_x != xy[0]
    @last_troop_y = xy[1] if @last_troop_y != xy[1]
  end # update_text_xy

  #----------------------------------------------------------------------------|
  #  Draws the party and troop atb mode text on the window                     |
  #----------------------------------------------------------------------------|
  def draw_text # Potential Hotspot
    contents.clear
	  super(@last_party_x, @last_party_y, contents.width, contents.height, 
    ecatb_pool_party_actor_text[$game_party.ecatb_pool ? 0 : 1], 0)
	  super(@last_troop_x, @last_troop_y, contents.width, contents.height, 
    ecatb_pool_troop_enemy_text[$game_troop.ecatb_pool ? 0 : 1], 0)
  end # draw_text

end # ECATB_Pool_Window

#------------------------------------------------------------------------------|
#  * Reconstructs the the whole battle flow to control the atb system          |
#------------------------------------------------------------------------------|
class Scene_Battle < Scene_Base # Edit

  #----------------------------------------------------------------------------|
  #  New public instance variables                                             |
  #----------------------------------------------------------------------------|
  attr_accessor :ecatb_clock_window # The atb clock window
  attr_accessor :ecatb_force_window # The atb force window
  attr_accessor :ecatb_order_window # The atb order window
  attr_accessor :ecatb_pool_window # The atb pool window

  #----------------------------------------------------------------------------|
  #  New private instance variables                                            |
  #----------------------------------------------------------------------------|
  # @ecatb_act_block: The action execution iterator block
  # @ecatb_cancel_help_window: The atb cancel help window
  # @ecatb_clock: The global atb clock
  # @ecatb_force_clock: The atb force status
  # @ecatb_refresh_block: The window refresh iterator block

  #----------------------------------------------------------------------------|
  #  Creates new methods, window command handlers, variables and blocks as well|
  #----------------------------------------------------------------------------|
  alias start_ecatb start
  def start(*argv, &argb)
    start_ecatb(*argv, &argb)
    ecatb_start # Added
  end # start

  #----------------------------------------------------------------------------|
  #  Updates the atb cancel window and force clock for the ecatb battle system |
  #----------------------------------------------------------------------------|
  alias update_basic_ecatb update_basic
  def update_basic # Hotspot
    update_basic_ecatb
    # Added
    return unless BattleManager.btype?(:ecatb)
    update_ecatb_cancel_window if update_ecatb_cancel_window?
    update_ecatb_force_clock
    #
  end # update_basic

  #----------------------------------------------------------------------------|
  #  Run the atb frame update if the wait conditions aren't met as well        |
  #----------------------------------------------------------------------------|
  alias update_for_wait_ecatb update_for_wait
  def update_for_wait # Hotspot
    update_for_wait_ecatb
    # Added
    return unless BattleManager.phase != :init && BattleManager.btype?(:ecatb)
    ecatb_update if ecatb_update?
    #
  end # update_for_wait

  #----------------------------------------------------------------------------|
  #  Moves the info viewport according to which windows are active as well     |
  #----------------------------------------------------------------------------|
  alias update_info_viewport_ecatb update_info_viewport
  def update_info_viewport # Hotspot
    update_info_viewport_ecatb
    ecatb_update_info_viewport if BattleManager.btype?(:ecatb) # Added
  end # update_info_viewport

  #----------------------------------------------------------------------------|
  #  Open the active status, actor command and party command windows as well   |
  #----------------------------------------------------------------------------|
  alias update_message_open_ecatb update_message_open
  def update_message_open # Hotspot
    update_message_open_ecatb
    # Added
    return if $game_message.busy?
    return unless @status_window.close?
    return if $game_troop.all_dead? || $game_party.all_dead?
    ecatb_update_message_open if BattleManager.btype?(:ecatb)
    #
  end # update_message_open

  #----------------------------------------------------------------------------|
  #  Create new windows in the ecatb battle system as well                     |
  #----------------------------------------------------------------------------|
  alias create_all_windows_ecatb create_all_windows
  def create_all_windows(*argv, &argb)
    create_all_windows_ecatb(*argv, &argb)
    create_ecatb_windows if BattleManager.btype?(:ecatb) # Added
  end # create_all_windows

  alias start_actor_command_selection_ecatb start_actor_command_selection
  def start_actor_command_selection # v0.05a+; Potential Hotspot
    start_actor_command_selection_ecatb
    @actor_command_window.show if BattleManager.btype?(:ecatb) # Added
  end # start_actor_command_selection

  #----------------------------------------------------------------------------|
  #  Processes unison attacks as well                                          |
  #----------------------------------------------------------------------------|
  alias command_attack_ecatb command_attack
  def command_attack(*argv, &argb)
    # Added
    return unless actor = BattleManager.actor
    if BattleManager.btype?(:ecatb)
      ecatb = DoubleX_RMVXA::ECATB
      actors = ecatb.send($data_skills[actor.attack_skill_id].
      ecatb_unison_actor, actor).collect!(&ecatb::BLOCKS[:usable?])
      return command_ecatb_unison_attack(actors) if actors.size > 1
    end
    #
    command_attack_ecatb(*argv, &argb)
    @status_window.draw_item(actor.index) # Added
  end # command_attack

  #----------------------------------------------------------------------------|
  #  Fixes bugs and edge cases                                                 |
  #----------------------------------------------------------------------------|
  alias command_skill_ecatb command_skill
  def command_skill(*argv, &argb)
    return if BattleManager.btype?(:ecatb) && !BattleManager.actor # Added
    command_skill_ecatb(*argv, &argb)
  end # command_skill

  #----------------------------------------------------------------------------|
  #  Confirms the guard and processes unison guards as well                    |
  #----------------------------------------------------------------------------|
  alias command_guard_ecatb command_guard
  def command_guard(*argv, &argb)
    # Added
    return unless actor = BattleManager.actor
    if ecatb = BattleManager.btype?(:ecatb)
      ecatb = DoubleX_RMVXA::ECATB
      actors = ecatb.send($data_skills[actor.guard_skill_id].
      ecatb_unison_actor, actor).collect!(&ecatb::BLOCKS[:usable?])
      return command_ecatb_unison_attack(actors) if actors.size > 1
    end
    actor.input.set_guard
    if ecatb
      actor.confirm_ecatb_item
      @status_window.draw_item(actor.index)
    end
    #
    command_guard_ecatb(*argv, &argb)
  end # command_guard

  #----------------------------------------------------------------------------|
  #  Confirms the skill/item and processes unison confirmation as well         |
  #----------------------------------------------------------------------------|
  alias on_actor_ok_ecatb on_actor_ok
  def on_actor_ok(*argv, &argb)
    # Added
    return unless actor = BattleManager.actor
    if BattleManager.btype?(:ecatb) && on_ecatb_unison?(:ok, @actor_window)
      return
    elsif BattleManager.btype?(:ecatb)
      actor.confirm_ecatb_item
      @status_window.draw_item(actor.index)
    end
    #
    on_actor_ok_ecatb(*argv, &argb)
  end # on_actor_ok

  #----------------------------------------------------------------------------|
  #  Confirms the skill/item and processes unison confirmation as well         |
  #----------------------------------------------------------------------------|
  alias on_enemy_ok_ecatb on_enemy_ok
  def on_enemy_ok(*argv, &argb)
    # Added
    return unless (actor = BattleManager.actor) && @enemy_window.ecatb_update?
    if BattleManager.btype?(:ecatb) && on_ecatb_unison?(:ok, @enemy_window)
      return
    elsif BattleManager.btype?(:ecatb)
      actor.confirm_ecatb_item
      @status_window.draw_item(actor.index)
    end
    #
    on_enemy_ok_ecatb(*argv, &argb)
  end # on_enemy_ok

  #----------------------------------------------------------------------------|
  #  Processes unison skill/item target cancellation as well                   |
  #----------------------------------------------------------------------------|
  # Alias
  DoubleX_RMVXA::ECATB::ON_TARGET_CANCEL.each_value { |val| module_eval(val) }
  #

  #----------------------------------------------------------------------------|
  #  Processes unison skill/item selection as well                             |
  #----------------------------------------------------------------------------|
  # Alias
  DoubleX_RMVXA::ECATB::ON_SKILL_ITEM_OK.each_value { |val| module_eval(val) }
  #

  #----------------------------------------------------------------------------|
  #  Closes all input windows right after finishing inputting actions          |
  #----------------------------------------------------------------------------|
  alias turn_start_ecatb turn_start
  def turn_start(*argv, &argb)
    return ecatb_turn_start if BattleManager.btype?(:ecatb) # Added
    turn_start_ecatb(*argv, &argb)
  end # turn_start

  #----------------------------------------------------------------------------|
  #  Triggers the atb frame update and executes forced actions as well         |
  #----------------------------------------------------------------------------|
  alias process_action_ecatb process_action
  def process_action # Hotspot
    return process_action_ecatb unless BattleManager.btype?(:ecatb) # Rewritten
    # Added
    ecatb_update if ecatb_update?
    return unless BattleManager.action_forced?
    exec_ecatb_act(@subject, true) if exec_ecatb_act?(@subject, true)
    #
  end # process_action

  #----------------------------------------------------------------------------|
  #  Refreshes all active command, item and target selection windows as well   |
  #----------------------------------------------------------------------------|
  alias status_redraw_target_ecatb status_redraw_target
  def status_redraw_target(target, &argb)
    # Added
    return if $game_party.all_dead? || $game_troop.all_dead?
    return unless BattleManager.phase
    #
    status_redraw_target_ecatb(target, &argb)
    # Added
    return unless BattleManager.btype?(:ecatb) && target.actor?
    refresh_ecatb_windows(true)
    #
  end # status_redraw_target

  def ecatb_start # v0.04d+; New
    create_ecatb_defs
    if BattleManager.btype?(:ecatb)
      set_ecatb_battler_window_handlers
      set_ecatb_actor_command_window_handlers
    end
    @ecatb_clock = { tick: 0, act: 0, battler: 0, force: 0 }
    @ecatb_force_clock = :nil
    init_ecatb_act_block
    init_ecatb_actor_refresh_block
  end # ecatb_start

  #----------------------------------------------------------------------------|
  #  Creates and checks the associated method for each configuration used here |
  #----------------------------------------------------------------------------|
  # config: The configuration requesting its associated method
  # validate: The configuration value validation flag
  def create_ecatb_def(config, validate = true) # New
    # Uses the name and value of configuration as its method's name and contents
    method = config.id2name
    eval(%Q(
  def #{method}#{DoubleX_RMVXA::ECATB::SCENE_BATTLE[config][0]}
    #{$game_system.send(config)}
  end
    ))
    #
    return unless validate
    check_ecatb_def(method, DoubleX_RMVXA::ECATB::SCENE_BATTLE[config])
  end # create_ecatb_def

  #----------------------------------------------------------------------------|
  #  Checks all new methods and resets them to the defaults if they're invalid |
  #----------------------------------------------------------------------------|
  module_eval(DoubleX_RMVXA::ECATB::CHECK_RESET_DEF[:SCENE_BATTLE]) # New

  #----------------------------------------------------------------------------|
  #  Initializes the new block to trade memory usage for time performance      |
  #----------------------------------------------------------------------------|
  def init_ecatb_act_block # New
    # Calls this block instead of an anonymous function per enumerable iteration
    @ecatb_act_block = -> battler {
      if battler.actor? && battler.input
        if !battler.input.last_ecatb_confirm && battler.input.ecatb_confirm
          battler.make_actions
        end
      end
      exec_ecatb_act(battler) if !@subject && exec_ecatb_act?(battler)
    }
    #
  end # init_ecatb_act_block

  #----------------------------------------------------------------------------|
  #  Initializes the new block to trade memory usage for time performance      |
  #----------------------------------------------------------------------------|
  def init_ecatb_actor_refresh_block # New
    # Calls this block instead of an anonymous function per enumerable iteration
    @ecatb_actor_refresh_block = -> mem {
      next unless mem.ecatb_refresh
      @actor_window.draw_item(mem.index) if @actor_window.active
      if @ecatb_cancel_window && @ecatb_cancel_window.active
        @ecatb_cancel_window.draw_item(mem.index)
      end
      @status_aid_window.refresh if @status_aid_window.visible
      @status_window.draw_item(mem.index) unless @status_window.close?
      mem.ecatb_refresh = false
      @ecatb_refresh = true
    }
    #
  end # init_ecatb_actor_refresh_block

  def create_ecatb_windows # New
    create_ecatb_cancel_window
    create_ecatb_clock_window
    create_ecatb_force_window
    create_ecatb_order_window
    create_ecatb_pool_window
  end # create_ecatb_windows

  #----------------------------------------------------------------------------|
  #  Closes all windows upon battle end                                        |
  #----------------------------------------------------------------------------|
  def close_ecatb_windows # New
    @ecatb_cancel_window.hide.deactivate.close if @ecatb_cancel_window
    close_ecatb_clock_window if @ecatb_clock_window
    close_ecatb_force_window if @ecatb_force_window
    close_ecatb_order_window if @ecatb_order_window
    close_ecatb_pool_window if @ecatb_pool_window
    [@actor_window, @enemy_window, @skill_window, @item_window, @help_window, 
     @actor_command_window, @party_command_window, @status_aid_window].each(
    &DoubleX_RMVXA::ECATB::BLOCKS[:close_ecatb_windows])
  end # close_ecatb_windows

  #----------------------------------------------------------------------------|
  #  Sets the battler window selection hotkeys and their handlers              |
  #----------------------------------------------------------------------------|
  def set_ecatb_battler_window_handlers # New
    battler_hotkeys = ecatb_battler_hotkeys
    create_ecatb_battler_hotkey_defs(battler_hotkeys, "actor", "actor")
    create_ecatb_battler_hotkey_defs(battler_hotkeys, "enemy", "enemy")
    battler_hotkeys.each_with_index { |hotkey, index|
      @actor_window.set_handler(hotkey, method(
      :"ecatb_actor_hotkey_#{index = index.to_s}"))
      @enemy_window.set_handler(hotkey, method(:"ecatb_enemy_hotkey_#{index}"))
    }
  end # set_ecatb_battler_window_handlers

  #----------------------------------------------------------------------------|
  #  Sets actor command window directional inputs and hotkeys and handlers     |
  #----------------------------------------------------------------------------|
  def set_ecatb_actor_command_window_handlers # New
    @actor_command_window.set_handler(:dir4, method(:prior_ecatb_actor))
    @actor_command_window.set_handler(:dir6, method(:next_ecatb_actor))
    actor_hotkeys = ecatb_battler_hotkeys
    create_ecatb_actor_command_hotkey_defs(actor_hotkeys)
    actor_hotkeys.each_with_index { |hotkey, index|
      @actor_command_window.set_handler(hotkey, method(
      :"ecatb_actor_command_hotkey_#{index.to_s}"))
    }
  end # set_ecatb_actor_command_window_handlers

  #----------------------------------------------------------------------------|
  #  Creates methods used by the actor command hotkey handlers                 |
  #----------------------------------------------------------------------------|
  def create_ecatb_actor_command_hotkey_defs(actor_hotkeys) # New
    actor_hotkeys.each_index { |index|
      next if respond_to?(:"ecatb_actor_command_hotkey_#{index = index.to_s}")
      eval(%Q(
    def ecatb_actor_command_hotkey_#{index}
      return if @ecatb_cancel_window && @ecatb_cancel_window.active
      return unless BattleManager.ecatb_input_list(true).include?(#{index})
      BattleManager.actor_index = #{index}
      start_actor_command_selection
    end
      ))
    }
  end # create_ecatb_actor_command_hotkey_defs

  def create_ecatb_cancel_window # New
    (@ecatb_cancel_help_window = Window_Help.new).visible = false
    (@ecatb_cancel_window = Window_BattleActor.new(@info_viewport)).x = 64
    @ecatb_cancel_window.set_handler(:ok, method(:on_ecatb_cancel_ok))
    @ecatb_cancel_window.set_handler(:cancel, method(:on_ecatb_cancel_back))
    battler_hotkeys = eval($game_system.ecatb_battler_hotkeys)
    create_ecatb_battler_hotkey_defs(battler_hotkeys, "cancel", "ecatb_cancel")
    battler_hotkeys.each_with_index { |hotkey, index|
      @ecatb_cancel_window.set_handler(hotkey, method(
      :"ecatb_cancel_hotkey_#{index.to_s}"))
    }
  end # create_ecatb_cancel_window

  #----------------------------------------------------------------------------|
  #  Creates methods used by the battler target selection hotkey handlers      |
  #----------------------------------------------------------------------------|
  def create_ecatb_battler_hotkey_defs(battler_hotkeys, type, window) # New
    battler_hotkeys.each_index { |index|
      eval(%Q(
    def ecatb_#{type}_hotkey_#{index = index.to_s}
      @#{window}_window.select(#{index})
    end
      )) unless respond_to?(:"ecatb_#{type}_hotkey_#{index}")
    }
  end # create_ecatb_battler_hotkey_defs

  def update_ecatb_cancel_window # New; Hotspot
    if @ecatb_cancel_window.active
      unless BattleManager.actor_sprite_ecatb_bar
        @ecatb_cancel_window.ecatb_bar_refresh
      end
      return
    end
    activate_ecatb_cancel_window if Input.trigger?(ecatb_cancel_key)
  end # update_ecatb_cancel_window

  def activate_ecatb_cancel_window # New
    @status_window.hide
    @actor_command_window.close if @actor_command_window.active
    @party_command_window.close if @party_command_window.active
    select_ecatb_cancel_selection
  end # activate_ecatb_cancel_window

  def on_ecatb_cancel_ok # New
    # Picks the actor and cancels that actor's action if it can be cancelled
    actor = $game_party.battle_members[@ecatb_cancel_window.index]
    return select_ecatb_cancel_selection unless actor.inputable?
    if actor.ecatb_val[:charge] <= 0.0 || actor.ecatb_val[:charge] >= 100.0
      return select_ecatb_cancel_selection unless actor.ecatb_esc
    end
    ecatb_cancel_act(actor)
    #
  end # on_ecatb_cancel_ok

  #----------------------------------------------------------------------------|
  #  Asks the actor to pay the action costs and clears that action             |
  #----------------------------------------------------------------------------|
  def ecatb_cancel_act(actor) # New
    # Asks all unison invokees to do those as well if the skill/item is unison
    if actor.ecatb_unison_actors.size < 2
      actor.ecatb_reset
      @status_window.draw_item(actor.index)
      @ecatb_cancel_window.draw_item(actor.index)
    else
      ecatb_cancel_unison_act(actor.ecatb_unison_actors)
    end
    #
    select_ecatb_cancel_selection
  end # ecatb_cancel_act

  #----------------------------------------------------------------------------|
  #  Pays the action costs and clears that action for unison skills/items      |
  #----------------------------------------------------------------------------|
  # actors: The unison actors
  def ecatb_cancel_unison_act(actors) # New
    actors.each { |actor|
      actor.ecatb_reset
      @status_window.draw_item(actor.index)
      @ecatb_cancel_window.draw_item(actor.index)
    }
  end # ecatb_cancel_unison_act

  def select_ecatb_cancel_selection # New
    @ecatb_cancel_window.show.activate.refresh
    @ecatb_cancel_help_window.show.activate.set_text(ecatb_cancel_text)
  end # select_ecatb_cancel_selection

  def on_ecatb_cancel_back # New
    @ecatb_cancel_window.hide.deactivate
    @ecatb_cancel_help_window.hide.deactivate
    @status_window.show
    @actor_command_window.open if @actor_command_window.active
    @party_command_window.open if @party_command_window.active
  end # on_ecatb_cancel_back

  def create_ecatb_clock_window # New
    return if @ecatb_clock_window
    return unless eval($game_system.show_ecatb_clock_window)
    @ecatb_clock_window = ECATB_Clock_Window.new(@ecatb_clock ? 
    @ecatb_clock[eval($game_system.ecatb_turn_type)] : 0, ecatb_max_clock)
  end # create_ecatb_clock_window

  def ecatb_max_clock # New
    if (type = eval($game_system.ecatb_turn_type)) == :tick
      return eval($game_system.ecatb_tick_count) * Graphics.frame_rate
    elsif type == :act
      return eval($game_system.ecatb_after_act)
    end
    eval($game_system.ecatb_battler_count) * 
    eval($game_system.ecatb_battler_scale)[0]
  end # ecatb_max_clock

  #----------------------------------------------------------------------------|
  #  Creates the atb force, order and pool windows                             |
  #----------------------------------------------------------------------------|
  # v0.01b+; New
  DoubleX_RMVXA::ECATB::CREATE_WINDOW.each_value { |val| module_eval(val) }
  #

  #----------------------------------------------------------------------------|
  #  Closes the atb clock, force, order and pool windows                       |
  #----------------------------------------------------------------------------|
  # v0.01b+; New
  DoubleX_RMVXA::ECATB::CLOSE_WINDOW.each_value { |val| module_eval(val) }
  #

  #----------------------------------------------------------------------------|
  #  Moves the info viewport according to which windows are active             |
  #----------------------------------------------------------------------------|
  def ecatb_update_info_viewport # New; Hotspot
    return move_info_viewport(128) if @actor_command_window.active || 
    @actor_window.active || @enemy_window.active
    move_info_viewport(0) if @party_command_window.active || 
    update_msg_open_ecatb_compatibility?
  end # ecatb_update_info_viewport

  #----------------------------------------------------------------------------|
  #  Opens the status, command, item and target windows if they're active      |
  #----------------------------------------------------------------------------|
  def ecatb_update_message_open # New; Hotspot
    @status_window.open
    return @actor_command_window.open if @skill_window.active || 
    @item_window.active || @actor_window.active || @enemy_window.active || 
    @actor_command_window.active
    @party_command_window.open if @party_command_window.active || 
    update_msg_open_ecatb_compatibility?
  end # ecatb_update_message_open

  #----------------------------------------------------------------------------|
  #  Closes all input windows right after finishing inputting actions          |
  #----------------------------------------------------------------------------|
  def ecatb_turn_start # New
    @party_command_window.close
    @actor_command_window.close
    @status_window.unselect
    @log_window.wait
    @log_window.clear
  end # ecatb_turn_start

  def update_ecatb_force_clock # New; Hotspot
    if Input.trigger?(ecatb_force_run_key)
      @ecatb_force_clock = @ecatb_force_clock == :stop ? :nil : :run
      @ecatb_force_window.draw_text(@ecatb_force_clock) if @ecatb_force_window
    elsif Input.trigger?(ecatb_force_stop_key)
      @ecatb_force_clock = @ecatb_force_clock == :run ? :nil : :stop
      @ecatb_force_window.draw_text(@ecatb_force_clock) if @ecatb_force_window
    end
  end # update_ecatb_force_clock

  #----------------------------------------------------------------------------|
  #  Runs the atb frame update                                                 |
  #----------------------------------------------------------------------------|
  def ecatb_update # New; Hotspot
    pre_ecatb_update
    ecatb_ctb_update
    return unless BattleManager.phase
    refresh_ecatb_windows
    ecatb_update_actors
    unless @party_command_window.active || @status_window.index >= 0
      unless @ecatb_cancel_window && @ecatb_cancel_window.active
        start_actor_command_selection if BattleManager.ecatb_update_act_actor?
      end
    end
    BattleManager.action_battlers.each(&@ecatb_act_block)
    post_ecatb_update
  end # ecatb_update

  #----------------------------------------------------------------------------|
  #  Runs the battle and all battlers' atb clocks until any of them has to stop|
  #----------------------------------------------------------------------------|
  def ecatb_ctb_update # v0.04d+; New; Hotspot
    begin
      ecatb_update_tick_battler_count
      BattleManager.ecatb_update
    end until BattleManager.ecatb_ctb_break?
    @ecatb_clock_window.refresh if @ecatb_clock_window
  end # ecatb_ctb_update

  #----------------------------------------------------------------------------|
  #  Refreshes all windows used by actors if at least 1 of them has refreshed  |
  #----------------------------------------------------------------------------|
  # redrawn: Whether the whole status window has been redrawn
  def refresh_ecatb_windows(redrawn = false) # New; Hotspot
    $game_party.alive_members.each(&@ecatb_actor_refresh_block)
    @ecatb_order_window.update_battler_icons if @ecatb_order_window
    if @ecatb_refresh
      [@skill_window, @item_window, @actor_command_window, 
      @party_command_window].each(
      &DoubleX_RMVXA::ECATB::BLOCKS[:refresh_ecatb_windows])
      refresh_ecatb_windows_compatibility
      return @ecatb_refresh = false
    end
    return if BattleManager.actor_sprite_ecatb_bar
    @status_window.ecatb_bar_refresh unless redrawn && @status_window.close?
    @actor_window.ecatb_bar_refresh if @actor_window.active
  end # refresh_ecatb_windows

  #----------------------------------------------------------------------------|
  #  Resets non-actable selected actor's atb and updates all windows           |
  #----------------------------------------------------------------------------|
  def ecatb_update_actors # New; Hotspot
    if @status_window.index >= 0
      return if BattleManager.ecatb_input_list(true).include?(
      @status_window.index)
      ecatb_update_windows
    elsif BattleManager.ecatb_input_list.empty?
      @party_command_window.deactivate.close if @party_command_window.active
    end
  end # ecatb_update_actors

  def ecatb_update_windows # New; Hotspot
    if @skill_window.visible || @item_window.visible || 
    @actor_window.visible || @enemy_window.visible
      @status_window.open.show
      @status_aid_window.hide
    end
    [@actor_window, @enemy_window, @skill_window, @item_window, 
     @actor_command_window].each(
     &DoubleX_RMVXA::ECATB::BLOCKS[:ecatb_update_windows])
    @status_window.unselect
  end # ecatb_update_windows

  def ecatb_update_tick_battler_count # New; Hotspot
    return ecatb_update_tick_count if (type = ecatb_turn_type) == :tick
    return if type != :battler || ecatb_battler_scale[1] != :tick
    ecatb_update_battler_count
  end # ecatb_update_tick_battler_count

  def ecatb_update_tick_count # New; Hotspot
    max_clock = ecatb_tick_count * Graphics.frame_rate
    if (@ecatb_clock[:tick] += 1) >= max_clock
      @ecatb_clock[:tick] = 0
      ecatb_turn_add
    end
    return unless @ecatb_clock_window
    @ecatb_clock_window.cur_clock = @ecatb_clock[:tick]
    @ecatb_clock_window.max_clock = max_clock
  end # ecatb_update_tick_count

  # forced: The action force flag
  def exec_ecatb_act(subject, forced = false) # New
    # Disables party escape during action executions
    BattleManager.ecatb_can_esc = false
    force_act_cost = nil
    if @subject.current_action
      force_act_cost = exec_ecatb_act_loop(forced)
      exec_ecatb_act_clock(forced)
      process_action_end
    end
    BattleManager.ecatb_can_esc = true
    #
    return if BattleManager.judge_win_loss
    exec_ecatb_act_reset(forced, force_act_cost) if BattleManager.phase
  end # exec_ecatb_act

  #----------------------------------------------------------------------------|
  #  Executes all the battler's valid actions and sets their costs             |
  #----------------------------------------------------------------------------|
  # forced: The action force flag
  def exec_ecatb_act_loop(forced) # New
    while @subject.current_action.valid?
      @subject.current_action.prepare
      execute_action
      force_act_cost = @subject.exec_ecatb_act_cost(forced)
      process_event
      @subject.remove_current_action
      return if force_act_cost = exec_ecatb_act_loop_compatibility?(forced)
    end
    force_act_cost
  end # exec_ecatb_act_loop

  # forced: The action force flag
  def exec_ecatb_act_clock(forced) # New
    return exec_ecatb_act_update(forced) if (type = ecatb_turn_type) == :act
    return if type != :battler || ecatb_battler_scale[1] != :act
    ecatb_update_battler_count(forced)
  end # exec_ecatb_act_clock

  # forced: The action force flag
  def exec_ecatb_act_update(forced) # New
    @ecatb_clock[:act] += 1 if !forced || ecatb_force_act_count
    if @ecatb_clock[:act] >= (after_act = ecatb_after_act)
      @ecatb_clock[:act] = 0
      ecatb_turn_add
    end
    return unless @ecatb_clock_window
    @ecatb_clock_window.cur_clock = @ecatb_clock[:act]
    @ecatb_clock_window.max_clock = after_act
    @ecatb_clock_window.refresh
  end # exec_ecatb_act_update

  # forced: The action force flag
  def ecatb_update_battler_count(forced = false) # New; Hotspot
    @ecatb_clock[:battler] += 1 if !forced || ecatb_force_act_count
    max_clock = ecatb_battler_count * ecatb_battler_scale[0]
    if @ecatb_clock[:battler] >= (max_clock *= Graphics.frame_rate)
      @ecatb_clock[:battler] = 0
      ecatb_turn_add
    end
    return unless @ecatb_clock_window
    @ecatb_clock_window.cur_clock = @ecatb_clock[:tick]
    @ecatb_clock_window.max_clock = max_clock
  end # ecatb_update_battler_count

  #----------------------------------------------------------------------------|
  #  Resets the battler's atb and refreshes the actor in the status window     |
  #----------------------------------------------------------------------------|
  # forced: The action force flag
  def exec_ecatb_act_reset(forced, force_act_cost) # New
    if !forced || force_act_cost
      if @subject.ecatb_unison_actors.size > 1
        (@subject.ecatb_unison_actors & $game_party.alive_members).each { |a|
          a.ecatb_reset
          @status_window.draw_item(a.index)
        }
      else
        @subject.ecatb_reset
        @status_window.draw_item(@subject.index) if @subject.actor?
      end
    end
    @subject = nil
  end # exec_ecatb_act_reset

  def ecatb_turn_add # New
    BattleManager.turn_end if BattleManager.phase
    ecatb_turn_add_compatibility
    BattleManager.ecatb_on_turn_end
    $game_troop.increase_turn
  end # ecatb_turn_add

  #----------------------------------------------------------------------------|
  #  Picks and setups the prior inputable actor if any                         |
  #----------------------------------------------------------------------------|
  def prior_ecatb_actor # New; Potential Hotspot
    return if @ecatb_cancel_window && @ecatb_cancel_window.active
    start_actor_command_selection if BattleManager.change_ecatb_actor?(-1)
  end # prior_ecatb_actor

  #----------------------------------------------------------------------------|
  #  Picks and setups the next inputable actor if any                          |
  #----------------------------------------------------------------------------|
  def next_ecatb_actor # New; Potential Hotspot
    return if @ecatb_cancel_window && @ecatb_cancel_window.active
    start_actor_command_selection if BattleManager.change_ecatb_actor?(1)
  end # next_ecatb_actor

  # actors: The unison actors
  def command_ecatb_unison_attack(actors) # New
    $game_temp.battle_aid = $data_skills[BattleManager.actor.attack_skill_id]
    actors.each { |actor|
      actor.input.set_attack
      @status_window.draw_item(actor.index)
    }
    select_enemy_selection
  end # command_ecatb_unison_attack

  # actors: The unison actors
  def command_ecatb_unison_guard(actors) # New
    $game_temp.battle_aid = $data_skills[BattleManager.actor.guard_skill_id]
    confirm_ecatb_unison_item(actors)
    next_command
  end # command_ecatb_unison_guard

  # actors: The unison actors
  # window: The window having the unison item
  def on_ecatb_unison_target_ok(actors, window) # New
    $game_temp.battle_aid = nil
    unless BattleManager.actor.usable?(BattleManager.actor.input.item)
      return on_ecatb_unison_target_cancel(actors, window)
    end
    confirm_ecatb_unison_item(actors, window)
    window.hide
    @skill_window.hide
    @item_window.hide
    next_command
  end # on_ecatb_unison_target_ok

  # actors: The unison actors
  # window: The window having the unison item
  def confirm_ecatb_unison_item(actors, window = nil) # New
    actors.each { |actor|
      window ? actor.input.target_index = window.index : actor.input.set_guard
      actor.ecatb_unison_invoker = actor == BattleManager.actor
      actor.confirm_ecatb_item
      @status_window.draw_item(actor.index)
    }
  end # confirm_ecatb_unison_item

  # actors: The unison actors
  # window: The window having the unison item
  def on_ecatb_unison_target_cancel(actors, window) # New
    # Clears the unison item from all unison actors and backs to the last window
    clear_ecatb_unison_item(actors)
    @status_aid_window.refresh
    $game_temp.battle_aid = nil
    window.hide
    on_ecatb_unison_target_cancel_compatibility
    #
  end # on_ecatb_unison_target_cancel

  # actors: The unison actors
  def clear_ecatb_unison_item(actors) # New
    (actors & BattleManager.ecatb_input_list).each { |actor|
      actor.input.clear if actor.input
      @status_window.draw_item(actor.index)
    }
  end # on_ecatb_unison_target_cancel

  # actors: The unison actors
  # window: The window having the unison item
  def on_ecatb_unison_item_ok(actors, window) # New
    $game_temp.battle_aid = item = window.item
    $game_party.last_item.object = item if item.is_a?(RPG::Item)
    skill = item.is_a?(RPG::Skill)
    actors.each { |actor|
      actor.input.set_skill(item.id)
      actor.last_skill.object = item if skill
      @status_window.draw_item(actor.index)
    }
    return select_enemy_selection if item.for_opponent?
    select_actor_selection if item.for_friend?
  end # on_ecatb_unison_item_ok

  # actors: The unison actors
  # window: The window using the command
  def on_ecatb_unison_command(actors, command, window) # New
    return on_ecatb_unison_target_ok(actors, window) if command == :ok
    on_ecatb_unison_target_cancel(actors, window)
  end # on_ecatb_unison_command

  #----------------------------------------------------------------------------|
  #  Checks if the unison skill/item can be inputted                           |
  #----------------------------------------------------------------------------|
  def on_ecatb_unison_item_ok?(window) # New
    # Checks if the skill/item is an unison one and all unison actors' present
    return false unless BattleManager.btype?(:ecatb)
    ecatb = DoubleX_RMVXA::ECATB
    actors = ecatb.send(window.item.ecatb_unison_actor, BattleManager.actor)
    actors.collect!(&ecatb::BLOCKS[:usable?])
    return false if actors.size < 2
    on_ecatb_unison_item_ok(actors, window)
    true
    #
  end # on_ecatb_unison_item_ok?

  def update_ecatb_cancel_window? # New; Hotspot
    # Checks if no window that can interfere the atb cancel window is shown
    return false if @actor_window.active || @enemy_window.active
    return false if @skill_window.active || @item_window.active
    return false if $game_message.busy?
    !update_msg_open_ecatb_compatibility?
    #
  end # update_ecatb_cancel_window?

  #----------------------------------------------------------------------------|
  #  Checks if the atb frame update should be run                              |
  #----------------------------------------------------------------------------|
  def ecatb_update? # New; Hotspot
    # Checks if atb frame update can be updated and the wait condition isn't met
    return false if scene_changing? || BattleManager.phase == :init
    return false if $game_party.all_dead? || $game_troop.all_dead?
    return false if $game_message.visible
    BattleManager.phase && !ecatb_wait_cond
    #
  end # ecatb_update?

  #----------------------------------------------------------------------------|
  #  Checks if the battler's actions should be executed                        |
  #----------------------------------------------------------------------------|
  # forced: The action force flag
  def exec_ecatb_act?(subject, forced = false) # New; Hotspot
    # Checks if the battler's valid and has a fully charged valid input
    if subject
      return false unless forced || subject.exec_ecatb_act?
      @subject = subject
    end
    @subject
    #
  end # exec_ecatb_act?

  #----------------------------------------------------------------------------|
  #  Checks if the unison item command handlers should be called               |
  #----------------------------------------------------------------------------|
  # window: The window using the command
  def on_ecatb_unison?(command, window) # New
    # Checks if the input is an unison item and calls unison handlers if so
    return false unless (actor = BattleManager.actor).input && actor.input.item
    ecatb = DoubleX_RMVXA::ECATB
    actors = ecatb.send(actor.input.item.ecatb_unison_actor, actor)
    actors.collect!(&ecatb::BLOCKS[:usable?])
    return false if actors.size < 2
    on_ecatb_unison_command(actors, command, window)
    true
    #
  end # on_ecatb_unison?

  #----------------------------------------------------------------------------|
  #  (New)Lets the compatibility fix deals with compatibility issues           |
  #----------------------------------------------------------------------------|

  def refresh_ecatb_windows_compatibility # Potential Hotspot
  end # refresh_ecatb_windows_compatibility

  def update_msg_open_ecatb_compatibility? # Hotspot
  end # update_msg_open_ecatb_compatibility?

  # forced: The action force flag
  def exec_ecatb_act_loop_compatibility?(forced)
    forced || !@subject.current_action
  end # exec_ecatb_act_loop_compatibility?

  def ecatb_turn_add_compatibility
  end # ecatb_turn_add_compatibility

  def on_ecatb_unison_target_cancel_compatibility
    # Shows the last window upon cancelling picking targets of unison skill/item
    if @actor_command_window.current_symbol == :skill
      return @skill_window.activate.show
    elsif @actor_command_window.current_symbol == :item
      return @item_window.activate.show
    end
    @actor_command_window.activate.show
    #
  end # on_ecatb_unison_target_cancel_compatibility

end # Scene_Battle

  # Aliases all methods using unison method rules
  DoubleX_RMVXA::ECATB::UNISON_DEFS.each { |klass, defs|
    klass_def = %Q(
class #{klass[0].id2name}#{klass[1] ? " < #{klass[1].id2name}" : ""}
    )
    defs.each { |name|
      klass_def += %Q(
  alias #{name = name.id2name}_ecatb #{name}
  def #{name}(*argv, &argb)
    return #{name}_ecatb(*argv, &argb) unless @ecatb_unison_item
    defs = @ecatb_unison_item.ecatb_unison_actor_def[:#{name}]
    return #{name}_ecatb(*argv, &argb) unless defs
    ecatb = DoubleX_RMVXA::ECATB
    defs = [#{name}_ecatb(*argv, &argb)] + (ecatb.send(defs, self) - [id]).
    collect! { |i| $game_actors[i].#{name}(*argv, &argb) }
    rule = ecatb.send(@ecatb_unison_item.ecatb_unison_def_rule[:#{name}], self)
    ecatb_unison_rules(defs, rule)
  end
     )
    }
    eval(klass_def + %Q(
end
    ))
  }

#------------------------------------------------------------------------------|

else

  # Informs users that they didn't place YEA-BattleEngine above this script
  msgbox("To use DoubleX RMVXA Enhanced YSA Battle System: Classical ATB, put it
          below:\n" + 
         "Yanfly Engine Ace - Ace Battle Engine\n" +
         "but above Main") unless $imported["YEA-BattleEngine"]

  # Informs users that they used YSA-CATB with this script
  msgbox("DoubleX RMVXA Enhanced YSA Battle System: Classical ATB can't be used
          with:\n" + 
         "YSA Battle System: Classical ATB") if $imported["YSA-CATB"]

end # if $imported["YEA-BattleEngine"] && !$imported["YSA-CATB"]

#==============================================================================|