Show posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Topics - DoubleX

1
I just received an email like this:
Title: Notification Case #(Some random numbers)
Sender: (Non-Paypal logo)service@paypal.com.(My PayPal account location) <(Non-PayPal email used by the real scammers)>
Recipients: (My email), (The email of an innocent straw man used by the real scammers)
Contents(With UI styles copying those in real PayPal emails):
Someone has logged into your account
We noticed a new login with your PayPal account associated with (The email of an innocent straw man used by the real scammers) from a device we don't recognize. Because of that we've temporarily limited your account until you renew and verify your identity.
Please click the button below to login into your account for verify your account.
(Login button copying that in real Paypal emails)
If this was you, please disregard this email.
(Footers copying those in real PayPal emails)

I admit that I'm incredibly stupid, because I almost believed that it's a real PayPal email, and I only realized that it's a scam right after I've clicked the login button, because it links to a URL that's completely different from the login page of the real PayPal(so fortunately I didn't input anything there).
While I've faced many old-schooled phishing emails and can figure them all out right from the start, I've never seen phishing emails like this, and what makes me feel even more dumb is that I already have 2FA applied to my PayPal account before receiving this scam email, meaning that my phone would've a PayPal verification SMS out of nowhere if there was really an unauthorized login to my account.

Of course, that straw man email owner is completely innocent, and I believe that owner already received the same scam email with me being the straw man, so that owner might think that I really performed unauthorized login into his/her PayPal account, if he/she didn't realize that the whole email's just a scam.
Before I realized that it's just a scam, I thought he/she really done what the email claims as well, so I just focused on logging into my PayPal accounts to assess the damages done and evaluate countermeasures to be taken, and if I didn't realize that it's just a scam, I'd already have given the password of my PayPal account to the scammers in their fake PayPal login page.

I suspect that many more PayPal users might have already received/are going to receive such scam emails, and I think this way of phishing can work for many other online payment gateways as well, so I think I can do some good by sharing my case, to hope that only I'll be this dumb(even though I didn't give the scammers my Paypal password at the end).
2
Mathematics / Using Abel-Ruffini theorem on encryptions
January 25, 2021, 07:54:12 am
The complete microsoft word file can be downloaded here(as a raw file)
 
Summary
 
The whole password setup/change process is as follows:
1. The client inputs the user ID and its password in plaintext
2. A salt for hashing the password in plaintexts will be randomly generated
3. The password will be combined with a fixed pepper in the client software source code and the aforementioned salt, to be hashed in the client terminal by SHA3-512 afterwards
4. The hashed password as a hexadecimal number with 128 digits will be converted to a base 256 number with 64 digits, which will be repeated 8 times in a special manner, and then broken down into a list of 512 literals, each being either numeric literals 1 to 100 or any of the 156 named constants
5. Each of those 512 numeric literals or named constants will be attached with existing numeric literals and named constants via different ways and combinations of additions, subtractions, multiplications and divisions, and the whole attachment process is determined by the fixed pepper in the client software source code
6. The same attachment process will be repeated, except that this time it's determined by a randomly generated salt in the client terminal
7. That list of 512 distinct roots, with the ordering among all roots and all their literal expressions preserved, will produce the resultant polynomial equation of degree 512
8. The resultant polynomial equation will be encoded into numbers and number separators in the client terminal
9. The encoded version will be encrypted by RSA-4096 on the client terminal with a public key there before being sent to the server, which has the private key
10. The server decrypts the encrypted polynomial equation from the client with its RSA-4096 private key, then decode the decrypted version in the server to recover the original polynomial equation, which will finally be stored there
11. The 2 aforementioned different salts will be encrypted by 2 different AES-256 keys in the client software source code, and their encrypted versions will be sent to the server to be stored there
12. The time complexity of the whole process, except the SHA3-512, RSA-4096 and AES-256, should be controlled to quadratic time
 
The whole login process is as follows:
1. The client inputs the user ID and its password in plaintext
2. The client terminal will send the user ID to the server, which will send its corresponding salts for hashing the password in plaintexts and forming distinct roots respectively, already encrypted in AES-256 back to the client terminal, assuming that the user ID from the client does exist in the server(otherwise the login fails and nothing will be sent back from the server)
3. The password will be combined with a fixed pepper in the client software source code, and the aforementioned salt that is decrypted in the client terminal using the AES-256 key in the client software source code, to be hashed in the client terminal by SHA3-512 afterwards
4. The hashed password as a hexadecimal number with 128 digits will be converted to a base 256 number with 64 digits, which will be repeated 8 times in a special manner, and then broken down into a list of 512 literals, each being either numeric literals 1 to 100 or any of the 156 named constants
5. Each of those 512 numeric literals or named constants will be attached with existing numeric literals and named constants via different ways and combinations of additions, subtractions, multiplications and divisions, and the whole attachment process is determined by the fixed pepper in the client software source code
6. The same attachment process will be repeated, except that this time it's determined by the corresponding salt sent from the server that is decrypted in the client terminal using a different AES-256 key in the client software source code
7. That list of 512 distinct roots, with the ordering among all roots and all their literal expressions preserved, will produce the resultant polynomial equation of degree 512
8. The resultant polynomial equation will be encoded into numbers and number separators in the client terminal
9. The encoded version will be encrypted by RSA-4096 on the client terminal with a public key there before being sent to the server, which has the private key
10. The server decrypts the encrypted polynomial equation from the client with its RSA-4096 private key, then decode the decrypted version in the server to recover the original polynomial equation
11. Whether the login will succeed depends on if the literal expression of the polynomial equation from the client exactly matches the expected counterpart already stored in the server
12. The time complexity of the whole process, except the SHA3-512, RSA-4096 and AES-256, should be controlled to quadratic time
 
For an attacker trying to get the raw password in plaintext:
1. If the attacker can only sniff the transmission from the client to the server to get the encoded then encrypted version(which is then encrypted by RSA-4096) of the polynomial equation, the salt of its roots, and the counterpart for the password in plaintext, the attacker first have to break RSA-4096, then the attacker has to figure out the highly secret and obfuscated algorithm to decode those numbers and number separators into the resultant polynomial equation and the way its roots are attached by existing numeric literals and named constants
2. If the attacker has the resultant polynomial equation of degree 512, its roots must be found, but there's no direct formula to do so analytically due to Abel-Ruffini theorem, and factoring such a polynomial with 156 different named constants efficiently is very, very complicated and convoluted
3. If the attacker has direct access to the server, the expected polynomial equation can be retrieved, but the attacker still has to solve that polynomial equation of degree 512 to find all its roots with the right ordering among them and all their correct literal expressions
4. If the attacker has direct access to the client software source codes, the pepper for hashing the password in plaintext, the pepper used on the polynomial equation roots, and the highly secret and obfuscated algorithm for using them with the salt counterparts can be retrieved, but it's still far from being able to find all the roots of the expected polynomial equation of degree 512
5. If the attacker has all those roots, the right ordering among them and all their correct literal expressions still have to be figured out, and the salts and peppers for those roots has to be properly removed as well
6. If the attacker has all those roots with the right ordering among them, all their correct literal expressions, and salts and peppers on them removed, the attacker has effectively recovered the hashed password, which is mixed with salts and peppers in plaintext
7. The attacker then has to figure out the password in plaintext even with the hashing function, salt, pepper, and the highly secret and obfuscated algorithm that combines them known
8. Unless there are really efficient algorithms for every step involved, the time complexity of the whole process can be as high as factorial time
9. As users are still inputting passwords in plaintexts, dictionary attacks still work to some extent, but if the users are careless with their password strengths, then no amount of cryptography will be safe enough
10. Using numerical methods to find all the roots won't work in most cases, because such methods are unlikely to find those roots analytically, let alone with the right ordering among them and all their right literal expressions, which are needed to produce the resultant polynomial equation with literal expressions exactly matching the expected one
11. Using rainbow tables won't work well either, because such table would be way too large to be used in practice, due to the number of polynomial equations with degree 512 being unlimited in theory
12. Strictly speaking, the whole password encryption scheme isn't a one-way function, but the time complexity needed for encryption compared to that for decryption is so trivial that this scheme can act like such a function
 
Areas demanding further researches:
1. The time complexity for factoring a polynomial of degree n with named constants into n factors analytically
2. Possibilities of collisions from the ordering among all roots and all their different literal expressions
3. Existence of efficient algorithms on finding the right ordering among all roots and all their right literal expressions
4. Strategies on setting up the fixed peppers and generating random salts to form roots with maximum encryption strength
 
Essentially, the whole approach on using polynomial equations for encryptions is to exploit equations that are easily formed by their analytical solution sets but very hard to solve analytically, especially when exact literal matches, rather than just mathematical identity, are needed to match the expected equations.
So it's not strictly restricted to polynomial equations with a very high degree, but maybe very high order partial differential equations with many variables, complex coefficients and functions accepting complex numbers can also work, because there are no known analytical algorithm on solving such equations yet, but analytical solutions are demanded to reproduce the same partial differential equations with exact literal matches, as long as performing partial differentiations analytically can be efficient enough.
3
DoubleX RMMZ TPBS Countdown States
Authors: DoubleX
Version: v1.00b
Type: TPBS State Countdown Add-on
Key Term: Battle Add-on

Purpose
Lets you set some states to update its turn after some seconds in TPBS

Introduction
*    1. This plugin lets you set some states to have its turn count updated
*      after a set amount of seconds in TPBS

Video


Games using this plugin
None so far

"Notetags": ShowHide

*    ## Notetag Info
*      1. Among all the same notetag types in the same data, only the 1st
*          can be effective
*      2. Each line can only have at most 1 notetag
*      3. The following is the structure of all notetags in this plugin:
*          - <doublex rmmz countdown states contents>
*          - <countdown states contents>
*          Where contents are in the form of type suffixes: entries
*          Either of the above can be used, but the 1st one reduce the chance
*          of causing other plugins to treat the notetags of this plugin as
*          theirs, while the 2nd one is more user-friendly
*          - type is one of the following:
*            1. interval
*          - suffixes is the list of suffixes in the form of:
*            suffix1 suffix2 suffix3 ... suffixn
*            Where each suffix is either of the following:
*            val(The notetag value will be used as-is)
*            switch(The value of the game switch with id as the notetag value
*                  will be used)
*            var(The value of the game variable with id as the notetag value
*                will be used)
*            (Advanced)script(The value of the game variable with id as the
*                            notetag value will be used as the contents of
*                            the functions to be called upon using the
*                            notetag)
*          - The this pointer of the script suffix is the battler involved
*            (Game_Battler.prototype)
*          - entries is the list of entries in the form of:
*            entry1, entry2, entry3, ..., entryn
*            Where entryi must conform with the suffixi specifications
*----------------------------------------------------------------------------
*    # State Notetags
*      1. interval condSuffix intervalSuffix: condEntry, intervalEntry
*        - Sets the state to be a countdown state having its turn counter
*          updated with interval being the returned value of intervalEntry
*          in TPBS if condEntry returns a truthy result
*        - condSuffix can be val, switch or script
*        - intervalEntry can be val, var or script
*        - The result of condEntry can be anything as only whether it's
*          truthy matters
*        - If the result of condEntry is falsy, this notetag will be
*          discarded upon such use cases
*        - The result of intervalEntry must be a Number
*        - intervalEntry being positive means the state turn counter will be
*          decreased every intervalEntry seconds
*        - intervalEntry being 0 means the state turn counter will be frozen
*        - intervalEntry being negative means the state turn counter will be
*          increased every intervalEntry seconds
*        - E.g.:
*          <countdown states interval switch val: 1, 2> will set the state
*          to be a countdown state having its turn counter decreased every
*          2 seconds if the game switch with id 1 is on


"Author Notes": ShowHide

DoubleX RMMZ State Triggers can be useful when setting some events to happen upon updating the countdown state turn counters


"Prerequisites": ShowHide

Plugins:
1. DoubleX RMMZ Enhanced Codebase
Abilities:
1. Nothing special


"Instructions": ShowHide

*      1. The default plugin parameters file name is
*        DoubleX_RMMZ_TPBS_Countdown_States
*        If you want to change that, you must edit the value of
*        DoubleX_RMMZ.TPBS_Countdown_States.PLUGIN_NAME, which must be done
*        via opening this plugin js file directly


"Terms Of Use": ShowHide

*      1. Commercial use's always allowed and crediting me's always optional.
*      2. You shall keep this plugin's Plugin Info part's contents intact.
*      3. You shalln't claim that this plugin's written by anyone other than
*        DoubleX or my aliases. I always reserve the right to deny you from
*        using any of my plugins anymore if you've violated this.
*      4. If you repost this plugin directly(rather than just linking back),
*        you shall inform me of these direct repostings. I always reserve
*        the right to request you to edit those direct repostings.
*      5. CC BY 4.0, except those conflicting with any of the above, applies
*        to this plugin, unless you've my permissions not needing follow so.
*      6. I always reserve the right to deny you from using this plugin
*        anymore if you've violated any of the above.


"Contributors": ShowHide

*      Authors:
*      1. DoubleX
*      Plugin Development Collaborators:
*      - None So Far
*      Bug Reporters:
*      - None So Far
*      Compatibility Issue Raisers:
*      - None So Far
*      Feature Requesters:
*      - None So Far


"Changelog": ShowHide

 *      { codebase: "1.1.0", plugin: "v1.00b" }(2020 Dec 11 GMT 0400):
 *      1. Adding the plugin command and query counterpart of the
 *         isTPBSCountdownState battler manipulation
 *      2. Documented the isTPBSCountdownState battler manipulation
 *      3. Fixed the bug of not removing countdown states nor triggering
 *         effects from plugin DoubleX RMMZ State Triggers*      { codebase: "1.1.0", plugin: "v1.00a" }(2020 Oct 30 GMT 1300):
*      1. 1st version of this plugin finished


Download Link
Demo Link
4
DoubleX RMMZ TPBS Actor Hotkeys
Authors: DoubleX
Version: v1.00b
Type: TPBS Inputtable Actor Selection Add-on
Key Term: Battle Add-on

Purpose
Lets you set some custom hotkeys to select some inputtable actors in TPBS

Introduction
*      1. By default, the TPBS only lets you select the next inputable actors
*        by pressing the cancel key
*      2. This plugin lets you set some hotkeys to select the previous
*        counterparts as well as those with specified party member indices

Video


Games using this plugin
None so far

"Parameters": ShowHide

* @param prevHotkey
* @desc Sets the keymap of the hotkey selecting the previous
* inputable actor
* @default left
*
* @param nextHotkey
* @desc Sets the keymap of the hotkey selecting the next inputable
* actor
* @default right
*
* @param indexHotkeys
* @type struct<IndexHotkey>[]
* @desc Sets the list of hotkeys selecting inputable actors in
* TPBS
* @default []


"Plugin Commands": ShowHide

* @command setTPBSActorPrevHotkey
* @desc Sets the keymap of the hotkey selecting the previous
* inputable actor
* @arg hotkey
* @desc The keymap of the hotkey selecting the previous inputable actor
*
* @command setTPBSActorNextHotkey
* @desc Sets the keymap of the hotkey selecting the next inputable
* actor
* @arg hotkey
* @desc The keymap of the hotkey selecting the next inputable actor
*
* @command setTPBSActorIndexHotkey
* @desc Sets the mapping from the actor index to the hotkey
* selecting the corresponding actor
* @arg actorIndex
* @type number
* @desc The index of the actor selected by hotkey actorHotkey
* @arg actorHotkey
* @desc The keymap of the hotkey selecting the actor with index actorIndex


"Author Notes": ShowHide

1. A custom key map plugin, like DoubleX_RMMZ_Custom_Key_Maps, can be useful when setting hotkeys to select targets in this plugin
2. The TPBS inputable actor selection hotkeys shouldn't be changed inside battles


"Prerequisites": ShowHide

Plugins:
1. DoubleX RMMZ Enhanced Codebase
Abilities:
1. Nothing special


"Terms Of Use": ShowHide

*      1. Commercial use's always allowed and crediting me's always optional.
*      2. You shall keep this plugin's Plugin Info part's contents intact.
*      3. You shalln't claim that this plugin's written by anyone other than
*        DoubleX or my aliases. I always reserve the right to deny you from
*        using any of my plugins anymore if you've violated this.
*      4. If you repost this plugin directly(rather than just linking back),
*        you shall inform me of these direct repostings. I always reserve
*        the right to request you to edit those direct repostings.
*      5. CC BY 4.0, except those conflicting with any of the above, applies
*        to this plugin, unless you've my permissions not needing follow so.
*      6. I always reserve the right to deny you from using this plugin
*        anymore if you've violated any of the above.


"Contributors": ShowHide

*      Authors:
*      1. DoubleX
*      Plugin Development Collaborators:
*      - None So Far
*      Bug Reporters:
*      - None So Far
*      Compatibility Issue Raisers:
*      - None So Far
*      Feature Requesters:
*      - None So Far


"Changelog": ShowHide

*      { codebase: "1.1.0", plugin: "v1.00b" }(2020 Dec 2 GMT 1000):
 *      1. You no longer have to edit the value of
 *         DoubleX_RMMZ.TPBS_Actor_Hotkeys.PLUGIN_NAME when changing this
 *         plugin file name
*      { codebase: "1.1.0", plugin: "v1.00a" }(2020 Oct 30 GMT 0900):
*      1. 1st version of this plugin finished


Download Link
Demo Link
5
DoubleX RMMZ TPBS Battle Turns
Authors: DoubleX
Version: v1.00b
Type: TPBS Battle Turn Add-on
Key Term: Battle Add-on

Purpose
Lets you set a TPBS battle turn as number of seconds or actions executed

Introduction
*      1. By default, the TPBS battle turns are defined as that of the
*        largest individual turns among all enemies
*      2. This plugin lets you redefine it as a set number of seconds or
*        actions executed

Video


Games using this plugin
None so far

"Parameters": ShowHide

* @param def
* @type select
* @option Default Definition
* @value def
* @option Number Of Seconds
* @value sec
* @option Number Of Actions Executed
* @value act
* @desc Sets the TPBS battle turn definition to be used
* This can be changed outside battles
* @default def
*
* @param secNum
* @type number
* @decimals 9
* @desc Sets the number of seconds in a TPBS battle turn
* It's only used if the defintion is number of seconds
* @default 4
*
* @param actNum
* @type number
* @desc Sets the number of actions executed in a TPBS battle turn
* It's only used if the defintion is number of actions executed
* @default 12


"Plugin Commands": ShowHide

* @command setTPBSBattleTurnsParam
* @desc Applies script call $gameSystem.setTPBSBattleTurnsParam(param, val)
* @arg param
* @desc The name of a valid parameter of this plugin
* @arg val
* @desc A valid new fully parsed value of the parameter param


"Author Notes": ShowHide

*      1. DON'T CHANGE THE BATTLE TURN DEFINTIION INSIDE BATTLES UNLESS YOU
*        REALLY KNOW WHAT YOU'RE TRULY DOING


"Prerequisites": ShowHide

Plugins:
1. DoubleX RMMZ Enhanced Codebase
Abilities:
1. Nothing special


"Terms Of Use": ShowHide

*      1. Commercial use's always allowed and crediting me's always optional.
*      2. You shall keep this plugin's Plugin Info part's contents intact.
*      3. You shalln't claim that this plugin's written by anyone other than
*        DoubleX or my aliases. I always reserve the right to deny you from
*        using any of my plugins anymore if you've violated this.
*      4. If you repost this plugin directly(rather than just linking back),
*        you shall inform me of these direct repostings. I always reserve
*        the right to request you to edit those direct repostings.
*      5. CC BY 4.0, except those conflicting with any of the above, applies
*        to this plugin, unless you've my permissions not needing follow so.
*      6. I always reserve the right to deny you from using this plugin
*        anymore if you've violated any of the above.


"Contributors": ShowHide

*      Authors:
*      1. DoubleX
*      Plugin Development Collaborators:
*      - None So Far
*      Bug Reporters:
*      - None So Far
*      Compatibility Issue Raisers:
*      - None So Far
*      Feature Requesters:
*      - None So Far


"Changelog": ShowHide

*      { codebase: "1.1.0", plugin: "v1.00b" }(2020 Dec 2 GMT 1000):
 *      1. You no longer have to edit the value of
 *        DoubleX_RMMZ.TPBS_Battle_Turns.PLUGIN_NAME when changing this
 *        plugin file name
*      { codebase: "1.1.0", plugin: "v1.00a" }(2020 Oct 30 GMT 0600):
*      1. 1st version of this plugin finished


Download Link
Demo Link
6
DoubleX RMMZ Script Call Hotkeys
Authors: DoubleX
Version: v1.00b
Type: Script Call Hotkey Add-on
Key Term: Misc Add-on

Purpose
Lets you set some hotkeys per scene to trigger some script calls

Video


Games using this plugin
None so far

"Parameters": ShowHide

* @param scriptCallHotkeys
* @type struct<SceneHotkeys>[]
* @desc Sets the list of hotkeys triggering script calls per scene
* @default []


"Author Notes": ShowHide

1. A custom key map plugin, like DoubleX_RMMZ_Custom_Key_Maps, can be useful when setting hotkeys to trigger script calls


"Prerequisites": ShowHide

Abilities:
1. Little RMMZ plugin development proficiency to fully utilize this
  (Elementary Javascript exposures being able to write beginner codes up to 300LoC scale)



"Terms Of Use": ShowHide

*      1. Commercial use's always allowed and crediting me's always optional.
*      2. You shall keep this plugin's Plugin Info part's contents intact.
*      3. You shalln't claim that this plugin's written by anyone other than
*        DoubleX or my aliases. I always reserve the right to deny you from
*        using any of my plugins anymore if you've violated this.
*      4. If you repost this plugin directly(rather than just linking back),
*        you shall inform me of these direct repostings. I always reserve
*        the right to request you to edit those direct repostings.
*      5. CC BY 4.0, except those conflicting with any of the above, applies
*        to this plugin, unless you've my permissions not needing follow so.
*      6. I always reserve the right to deny you from using this plugin
*        anymore if you've violated any of the above.


"Contributors": ShowHide

*      Authors:
*      1. DoubleX
*      Plugin Development Collaborators:
*      - None So Far
*      Bug Reporters:
*      - None So Far
*      Compatibility Issue Raisers:
*      - None So Far
*      Feature Requesters:
*      - None So Far


"Changelog": ShowHide

*      { codebase: "1.1.0", plugin: "v1.00b" }(2020 Dec 2 GMT 0800):
 *      1. You no longer have to edit the value of
 *        DoubleX_RMMZ.Script_Call_Hotkeys.PLUGIN_NAME when changing this
 *        plugin file name
*      { codebase: "1.0.2", plugin: "v1.00a" }(2020 Oct 14 GMT 0700):
*      1. 1st version of this plugin finished


Download Link
Demo Link
7
RMMZ Script Database / [MZ] DoubleX RMMZ Plugin Query
October 07, 2020, 09:51:19 am
DoubleX RMMZ Plugin Query
Authors: DoubleX
Version: v1.00b
Type: Plugin Query Add-on
Key Term: Misc Add-on

Purpose
Lets you use plugin queries in conditional branch and control variables

Introduction
*      1. The RMMZ plugin commands are supposed to make side effects but not
*        return end results
*      2. With this plugin, other plugins can declare plugin queries that
*        behave like RMMV plugin commands but return end results instead of
*        making side effects
*      3. Plugin queries can replace skill/item damage formulae
*      4. Plugin queries can also replace script calls in conditional branch
*        and control variables event commands

Video


Games using this plugin
None so far

"Parameters": ShowHide

* @param newDamageFormulaPluginQueries
* @type struct<NewPluginQuery>[]
* @desc Sets the list of new damage formula plugin queries
* This list shouldn't include those already added by other plugins
* @default []
*
* @param newEventCmdPluginQueries
* @type struct<NewPluginQuery>[]
* @desc Sets the list of new event command plugin queries
* This list shouldn't include those already added by other plugins
* @default []


"Plugin Query Info": ShowHide

*    1. General form
*      queryName argName1 argName2 argName3 argNameI argNameN
*      E.g.:
*      - If the plugin query has its query name as abcdefg and arguments
*        as h, i, j and k, then the plugin query is abcdefg h i j k
*    2. (Plugin Developers Only)Registration
*      PluginManager.damageFormulaPluginQueries.set(name, func);
*      - Registers a plugin query with the name being name and function
*        returning the result being func
*      - The first 5 arguments of the function must be the following:
*        i. item - The skill/item having the damage formula
*        ii. a - The subject executing the skill/item
*        iii. b - The target having the damage formula applied to
*        iv. v - The raw data list of the game variables
*        v. sign - 1(damage)/-1(recovery)
*      - The registered plugin query can be used in skill/item damage
*        formulae
*      E.g.:
*      - PluginManager.damageFormulaPluginQueries.set("matDmg", (item, a, b, v, sign, baseDmg) => {
*            return +baseDmg + a.mat * 2 - b.mdf * 2;
*        });
*        Will define the plugin query atkDmg in the skill/item damage
*        formulae as baseDmg + a.mat * 2 - b.mdf * 2
*        Where baseDmg must be a Number
*      PluginManager.eventCmdPluginQueries.set(name, func);
*      - Registers a plugin query with the name being name and function
*        returning the result being func
*      - The registered plugin query can be used in conditional branch and
*        control variables event commands
*      E.g.:
*      - PluginManager.eventCmdPluginQueries.set("isActorAnyStateAffected", (actorId, paramIds) => {
*            return $gameActors.actor(+actorId).isAnyStateAffected(paramIds.split("_").map(Number));
*        });
*        Will define the plugin query
*        isActorAnyStateAffected actorId paramIds
*        in the conditional branch/control variables event commands as
*        $gameActors.actor(actorId).isAnyStateAffected(paramIds);
*        If paramIds is written in the form of
*        paramId1_paramId2_paramId3_paramIdI_paramIdN


"Author Notes": ShowHide

*      1. The plugin command name collision issues in RMMV applies to
*        plugin queries registed to this RMMZ plugin as well, and in this
*        case, the last registered plugin query having the same name will be
*        used
*      2. DON'T MAKE SIDE EFFECTS IN THE SKILL/ITEM DAMAGE FORMULA PLUGIN
*        QUERIES UNLESS YOU REALLY KNOW WHAT YOU'RE TRULY DOING


"Prerequisites": ShowHide

Plugins:
1. DoubleX RMMZ Enhanced Codebase
Abilities(Plugin Users):
1. Nothing special
Abilities(Plugin Developers):
1. Little RMMZ plugin development proficiency to fully utilize this
  (Elementary Javascript exposures being able to write beginner codes up to 300LoC scale)


"Terms Of Use": ShowHide

*      1. Commercial use's always allowed and crediting me's always optional.
*      2. You shall keep this plugin's Plugin Info part's contents intact.
*      3. You shalln't claim that this plugin's written by anyone other than
*        DoubleX or my aliases. I always reserve the right to deny you from
*        using any of my plugins anymore if you've violated this.
*      4. If you repost this plugin directly(rather than just linking back),
*        you shall inform me of these direct repostings. I always reserve
*        the right to request you to edit those direct repostings.
*      5. CC BY 4.0, except those conflicting with any of the above, applies
*        to this plugin, unless you've my permissions not needing follow so.
*      6. I always reserve the right to deny you from using this plugin
*        anymore if you've violated any of the above.


"Contributors": ShowHide

*      Authors:
*      1. DoubleX
*      Plugin Development Collaborators:
*      - None So Far
*      Bug Reporters:
*      - None So Far
*      Compatibility Issue Raisers:
*      - None So Far
*      Feature Requesters:
*      - None So Far


"Changelog": ShowHide

*      { codebase: "1.1.0", plugin: "v1.00b" }(2020 Dec 2 GMT 0700):
 *      1. You no longer have to edit the value of
 *         DoubleX_RMMZ.Plugin_Query.PLUGIN_NAME when changing this plugin
 *         file name
*      { codebase: "1.0.2", plugin: "v1.00a" }(2020 Oct 6 GMT 1600):
*      1. 1st version of this plugin finished


Download Link
Demo Link
8
RMMZ Script Database / [MZ] DoubleX RMMZ Targeting Hotkeys
September 29, 2020, 12:19:08 pm
DoubleX_RMMZ_Targeting_Hotkeys
Authors: DoubleX
Version: v1.00b
Type: Target Selection Add-on
Key Term: Battle Add-on

Purpose
Lets you set some custom hotkeys to select some skill/item targets

Video


Games using this plugin
None so far

"Parameter": ShowHide

* @param hotkeys
* @type struct<Hotkey>[]
* @desc Sets the list of hotkeys selecting skill/item targets
* @default []


"Plugin Command": ShowHide

* @command setTargetingHotkey
* @desc Sets the mapping from the target index to the hotkey
* selecting the corresponding target
* @arg targetIndex
* @type number
* @desc The index of the target selected by hotkey targetHotkey
* @arg targetHotkey
* @type string
* @desc The keymap of the hotkey selecting the target with index targetIndex


"Author Notes": ShowHide

1. A custom key map plugin, like DoubleX_RMMZ_Custom_Key_Maps, can be useful when setting hotkeys to select targets in this plugin


"Prerequisites": ShowHide

Plugins:
1. DoubleX RMMZ Enhanced Codebase
Abilities:
1. Nothing special for most ordinary cases
2. Little RMMZ plugin development proficiency to fully utilize this
    (Elementary Javascript exposures being able to write beginner codes up to 300LoC scale)


"Terms Of Use": ShowHide

*      1. Commercial use's always allowed and crediting me's always optional.
*      2. You shall keep this plugin's Plugin Info part's contents intact.
*      3. You shalln't claim that this plugin's written by anyone other than
*        DoubleX or my aliases. I always reserve the right to deny you from
*        using any of my plugins anymore if you've violated this.
*      4. If you repost this plugin directly(rather than just linking back),
*        you shall inform me of these direct repostings. I always reserve
*        the right to request you to edit those direct repostings.
*      5. CC BY 4.0, except those conflicting with any of the above, applies
*        to this plugin, unless you've my permissions not needing follow so.
*      6. I always reserve the right to deny you from using this plugin
*        anymore if you've violated any of the above.


"Contributors": ShowHide

*      Authors:
*      1. DoubleX
*      Plugin Development Collaborators:
*      - None So Far
*      Bug Reporters:
*      - None So Far
*      Compatibility Issue Raisers:
*      - None So Far
*      Feature Requesters:
*      - None So Far


"Changelog": ShowHide

*      { codebase: "1.1.0", plugin: "v1.00b" }(2020 Dec 2 GMT 0900):
 *      1. You no longer have to edit the value of
 *        DoubleX_RMMZ.Targeting_Hotkeys.PLUGIN_NAME when changing this
 *        plugin file name
*      { codebase: "1.0.2", plugin: "v1.00a" }(2020 Sep 29 GMT 0400):
*      1. 1st version of this plugin finished


Download Link
Demo Link
9
RMMZ Script Database / [MZ] DoubleX RMMZ Custom Key Maps
September 29, 2020, 12:17:21 pm
DoubleX_RMMZ_Custom_Key_Maps
Authors: DoubleX
Version: v1.00b
Type: Keyboard Add-on
Key Term: Misc Add-on

Purpose
Lets you use more keys in the keyboard for RMMZ by setting the key maps

Video


Games using this plugin
None so far

"Parameter": ShowHide

* @param keyMaps
* @type struct<KeyMap>[]
* @desc Sets the list of custom key maps with codes and names
* @default []


"Prerequisites": ShowHide

Abilities:
1. Nothing special


"Terms Of Use": ShowHide

*      1. Commercial use's always allowed and crediting me's always optional.
*      2. You shall keep this plugin's Plugin Info part's contents intact.
*      3. You shalln't claim that this plugin's written by anyone other than
*        DoubleX or my aliases. I always reserve the right to deny you from
*        using any of my plugins anymore if you've violated this.
*      4. If you repost this plugin directly(rather than just linking back),
*        you shall inform me of these direct repostings. I always reserve
*        the right to request you to edit those direct repostings.
*      5. CC BY 4.0, except those conflicting with any of the above, applies
*        to this plugin, unless you've my permissions not needing follow so.
*      6. I always reserve the right to deny you from using this plugin
*        anymore if you've violated any of the above.


"Contributors": ShowHide

*      Authors:
*      1. DoubleX
*      Plugin Development Collaborators:
*      - None So Far
*      Bug Reporters:
*      - None So Far
*      Compatibility Issue Raisers:
*      - None So Far
*      Feature Requesters:
*      - None So Far


"Changelog": ShowHide

*      { codebase: "1.1.0", plugin: "v1.00b" }(2020 Dec 2 GMT 0600):
 *      1. You no longer have to edit the value of
 *        DoubleX_RMMZ.Custom_Key_Maps.PLUGIN_NAME when changing this plugin
 *        file name
*      { codebase: "1.0.2", plugin: "v1.00a" }(2020 Sep 29 GMT 1600):
*      1. 1st version of this plugin finished


Download Link
Demo Link
10
RMMZ Script Database / [MZ] DoubleX RMMZ Permanent States
September 28, 2020, 11:23:40 am
DoubleX RMMZ Permanent States
Authors: DoubleX
Version: v1.00a
Type: State Add-on
Key Term: Battle Add-on

Purpose
Lets you set some states to persist after the battler's dead and revived

Introduction
*      1. The default RMMZ states are all gone when the battler's dead
*      2. This plugin lets you set some states to persist after the battler's
*        dead and revived afterwards

Video

Games using this plugin
None so far

"Notetags": ShowHide

*    ## Notetag Info
*      1. Among all the same notetag types in the same data, all can be
*          effective
*      2. Each line can only have at most 1 notetag
*      3. The following is the structure of all notetags in this plugin:
*          - <doublex rmmz permanent states contents>
*          - <permanent states contents>
*          Where contents are in the form of type suffixes: entries
*          Either of the above can be used, but the 1st one reduce the chance
*          of causing other plugins to treat the notetags of this plugin as
*          theirs, while the 2nd one is more user-friendly
*          - type is one of the following:
*            1. battle
*            2. map
*            (Search tag: NOTE_TYPE)
*          - suffixes is the list of suffixes in the form of:
*            suffix1 suffix2 suffix3 ... suffixn
*            Where each suffix is either of the following:
*            val(The notetag value will be used as-is)
*            switch(The value of the game switch with id as the notetag value
*                  will be used)
*            var(The value of the game variable with id as the notetag value
*                will be used)
*            (Advanced)script(The value of the game variable with id as the
*                            notetag value will be used as the contents of
*                            the functions to be called upon using the
*                            notetag)
*          - The this pointer of the script suffix is the battler involved
*            (Game_BattlerBase.prototype)
*          - entries is the list of entries in the form of:
*            entry1, entry2, entry3, ..., entryn
*            Where entryi must conform with the suffixi specifications
*----------------------------------------------------------------------------
*    # State Notetags
*      1. battle condSuffix typeSuffix: condEntry, typeEntry
*        - Sets the permanent state type as specified by typeEntry inside
*          battles if condEntry returns a truthy result
*        - condSuffix can be val, switch or script
*        - The result of condEntry can be anything as only whether it's
*          truthy matters
*        - typeEntry can be val, var or script
*        - typeEntry must be either of the following:
*          persist - The state will be kept upon death
*          recover - The state will be kept upon recover all
*          revive - The state will be added back upon revival
*        - E.g.:
*          <permanent states battle switch val: 1, persist> will make the
*          state to be kept upon death inside battles if the game switch
*          with id 1 is on
*      2. map condSuffix typeSuffix: condEntry, typeEntry
*        - Sets the permanent state type as specified by typeEntry outside
*          battles if condEntry returns a truthy result
*        - condSuffix can be val, switch or script
*        - The result of condEntry can be anything as only whether it's
*          truthy matters
*        - typeEntry can be val, var or script
*        - typeEntry must be either of the following:
*          persist - The state will be kept upon death
*          recover - The state will be kept upon recover all
*          revive - The state will be added back upon revival
*        - E.g.:
*          <permanent states battle val var: true, 1> will make the
*          state to be kept upon recover all outside battles if the value of
*          the game variable with id 1 is "recover"


"Prerequisites": ShowHide

Plugins:
1. DoubleX RMMZ Enhanced Codebase
Abilities:
1. Nothing special for most ordinary cases
2. Little RMMZ plugin development proficiency to fully utilize this
    (Elementary Javascript exposures being able to write beginner codes up to 300LoC scale)


"Terms Of Use": ShowHide

*      1. Commercial use's always allowed and crediting me's always optional.
*      2. You shall keep this plugin's Plugin Info part's contents intact.
*      3. You shalln't claim that this plugin's written by anyone other than
*        DoubleX or my aliases. I always reserve the right to deny you from
*        using any of my plugins anymore if you've violated this.
*      4. If you repost this plugin directly(rather than just linking back),
*        you shall inform me of these direct repostings. I always reserve
*        the right to request you to edit those direct repostings.
*      5. CC BY 4.0, except those conflicting with any of the above, applies
*        to this plugin, unless you've my permissions not needing follow so.
*      6. I always reserve the right to deny you from using this plugin
*        anymore if you've violated any of the above.


"Contributors": ShowHide

*      Authors:
*      1. DoubleX
*      Plugin Development Collaborators:
*      - None So Far
*      Bug Reporters:
*      - None So Far
*      Compatibility Issue Raisers:
*      - None So Far
*      Feature Requesters:
*      - None So Far


"Changelog": ShowHide

*      { codebase: "1.0.2", plugin: "v1.00a" }(2020 Sep 28 GMT 0500):
*      1. 1st version of this plugin finished


Download Link
Demo Link
11
RMMZ Script Database / [MZ] DoubleX RMMZ Confusion Edit
September 27, 2020, 12:00:50 pm
DoubleX RMMZ Confusion Edit
Authors: DoubleX
Version: v1.00a
Type: Confusion State Add-on
Key Term: Battle Add-on

Purpose
Lets you set some confusion states to not be restricted to attacks only

Introduction
*      1. The default RMMZ confusion causes the battler to only use attack
*        and nothing else
*      2. This plugin lets you set some confusion states to cause the
*        battlers to behave like autobattle ones, with the definitions of
*        friends and opponents being reversed

Video


Games using this plugin
None so far

"Todo": ShowHide

*      1. Makes the reverse notetag works with substitute as well


"Notetags": ShowHide

*    ## Notetag Info
*      1. Among all the same notetag types in the same data, only the 1st
*          one can be effective
*      2. Each line can only have at most 1 notetag
*      3. The following is the structure of all notetags in this plugin:
*          - <doublex rmmz confusion edit contents>
*          - <confusion edit contents>
*          Where contents are in the form of type suffixes: entries
*          Either of the above can be used, but the 1st one reduce the chance
*          of causing other plugins to treat the notetags of this plugin as
*          theirs, while the 2nd one is more user-friendly
*          - type is one of the following:
*            1. reverse
*            2. excludeSelf
*            (Search tag: NOTE_TYPE)
*          - suffixes is the list of suffixes in the form of:
*            suffix1 suffix2 suffix3 ... suffixn
*            Where each suffix is either of the following:
*            val(The notetag value will be used as-is)
*            switch(The value of the game switch with id as the notetag value
*                  will be used)
*            var(The value of the game variable with id as the notetag value
*                will be used)
*            (Advanced)script(The value of the game variable with id as the
*                            notetag value will be used as the contents of
*                            the functions to be called upon using the
*                            notetag)
*          - The this pointer of the script suffix is the action involved
*            (Game_Action.prototype)
*          - entries is the list of entries in the form of:
*            entry1, entry2, entry3, ..., entryn
*            Where entryi must conform with the suffixi specifications
*----------------------------------------------------------------------------
*    # State Notetags
*      1. reverse condSuffix: condEntry
*        - Reverses the definitions of friends and opponents instead of
*          using the default confusion behaviors when condEntry returns a
*          truthy result
*        - condSuffix can be val, switch or script
*        - The result of condEntry can be anything as only whether it's
*          truthy matters
*        - Reversal will never take place for state Restriction as Attack an
*          Enemy nor skill/item scope as The User
*        - Reversal will have 50% chance to take place for state Restriction
*          as Attack Anyone
*        - Reversal will always take place for state Restriction as Attack
*          an Ally
*        - E.g.:
*          <confusion edit reverse switch: 1> will reverse the definitions
*          of friends and opponents if the game switch with id 1 is on
*      2. excludeSelf condSuffix: condEntry
*        - Ensures the battler won't target self when condEntry returns a
*          truthy result and the actions aren't forced
*        - This only applies to skills/items with Number as One in Scope
*        - This won't apply if self is the only possible target
*        - condSuffix can be val, switch or script
*        - The result of condEntry can be anything as only whether it's
*          truthy matters
*        - E.g.:
*          <confusion edit excludeSelf val: true> will always ensure the
*          battler won't target self when the actions aren't forced


"Prerequisites": ShowHide

Plugins:
1. DoubleX RMMZ Enhanced Codebase
Abilities:
1. Nothing special for most ordinary cases
2. Little RMMZ plugin development proficiency to fully utilize this
    (Elementary Javascript exposures being able to write beginner codes up to 300LoC scale)


"Terms Of Use": ShowHide

*      1. Commercial use's always allowed and crediting me's always optional.
*      2. You shall keep this plugin's Plugin Info part's contents intact.
*      3. You shalln't claim that this plugin's written by anyone other than
*        DoubleX or my aliases. I always reserve the right to deny you from
*        using any of my plugins anymore if you've violated this.
*      4. If you repost this plugin directly(rather than just linking back),
*        you shall inform me of these direct repostings. I always reserve
*        the right to request you to edit those direct repostings.
*      5. CC BY 4.0, except those conflicting with any of the above, applies
*        to this plugin, unless you've my permissions not needing follow so.
*      6. I always reserve the right to deny you from using this plugin
*        anymore if you've violated any of the above.


"Contributors": ShowHide

*      Authors:
*      1. DoubleX
*      Plugin Development Collaborators:
*      - None So Far
*      Bug Reporters:
*      - None So Far
*      Compatibility Issue Raisers:
*      - None So Far
*      Feature Requesters:
*      - None So Far


"Changelog": ShowHide

*      { codebase: "1.0.2", plugin: "v1.00a" }(2020 Sep 27 GMT 1600):
*      1. 1st version of this plugin finished


Download Link
Demo Link
12
RMMZ Script Database / [MZ] DoubleX RMMZ TPBS CTB
September 27, 2020, 03:32:43 am
DoubleX RMMZ TPBS CTB
Authors: DoubleX
Version: v1.00b
Type: CTB Add-on
Key Term: Battle Add-on

Purpose
Lets you mimic the CTB functionality in the TPBS on the fly

Introduction
*      1. This plugin lets you skip TPBS frames having no important moments,
*        like inputting actions, executing actions, to mimic the CTB
*        functionality in TPBS

Video

Games using this plugin
None so far

"Parameters": ShowHide

* @param isCTB
* @type boolean
* @desc Sets whether the CTB mode will be enabled in TPBS
* This can be changed inside as well as outside battles
* @default true


"Plugin Commands": ShowHide

* @command setIsTPBSCTB
* @desc Sets whether the CTB mode will be enabled in TPBS
* This can be changed inside as well as outside battles
* @arg isCTB
* @type boolean
* @desc Whether the CTB mode will be enabled in TPBS


"Author Notes": ShowHide

*      1. DON'T USE THE CTB FUNCTIONALITY IN ACTIVE TPBS UNLESS YOU REALLY
*        KNOW WHAT YOU'RE TRULY DOING


"Prerequisites": ShowHide

Plugins:
1. DoubleX RMMZ Enhanced Codebase
Abilities:
1. Nothing special


"Terms Of Use": ShowHide

*      1. Commercial use's always allowed and crediting me's always optional.
*      2. You shall keep this plugin's Plugin Info part's contents intact.
*      3. You shalln't claim that this plugin's written by anyone other than
*        DoubleX or my aliases. I always reserve the right to deny you from
*        using any of my plugins anymore if you've violated this.
*      4. If you repost this plugin directly(rather than just linking back),
*        you shall inform me of these direct repostings. I always reserve
*        the right to request you to edit those direct repostings.
*      5. CC BY 4.0, except those conflicting with any of the above, applies
*        to this plugin, unless you've my permissions not needing follow so.
*      6. I always reserve the right to deny you from using this plugin
*        anymore if you've violated any of the above.



"Contributors": ShowHide

*      Authors:
*      1. DoubleX
*      Plugin Development Collaborators:
*      - None So Far
*      Bug Reporters:
*      - None So Far
*      Compatibility Issue Raisers:
*      - None So Far
*      Feature Requesters:
*      - None So Far


"Changelog": ShowHide

*      { codebase: "1.1.0", plugin: "v1.00b" }(2020 Dec 2 GMT 1000):
 *      1. You no longer have to edit the value of
 *         DoubleX_RMMZ.TPBS_CTB.PLUGIN_NAME when changing this plugin file
 *         name
*      { codebase: "1.0.2", plugin: "v1.00a" }(2020 Sep 27 GMT 0400):
*      1. 1st version of this plugin finished


Download Link
Demo Link
13
DoubleX RMMZ Custom Script Calls
Authors: DoubleX
Version: v1.00b
Type: Script Call Add-on
Key Term: Misc Add-on

Purpose
Lets you set new script calls as old ones with some arguments bound

Introduction
*      1. Sometimes, some script calls always have the same argument values
*        used again and again, and defining new script calls as calling old
*        ones with some argument values already defined can be favorable
*      2. With this plugin, you can effectively apply partial applications to
*        script calls without the restrictions of always predefining the
*        first arguments only

Video
[MEDIA=youtube]S8BK_ApNnQw[/MEDIA]

Games using this plugin
None so far

"Parameters": ShowHide

* @param newScriptCalls
 * @type struct<NewScriptCall>[]
 * @desc Sets the list of new script calls
 * They're existing ones with some argument values already set
 * @default []



"Prerequisites": ShowHide

Plugins:
1. DoubleX RMMZ Enhanced Codebase
Abilities:
1. Little RMMZ plugin development proficiency to fully utilize this
  (Elementary Javascript exposures being able to write beginner codes up to 300LoC scale)


"Author Notes": ShowHide

*      1. If multiple new script calls have the same name, the one having the
*        lowest ordering in newScriptCalls will be used
*        (Search tag: Last_In_Duplicate_Script_Calls)
*      2. (Advanced)DON'T REDEFINE EXISTING SCRIPT CALLS UNLESS YOU REALLY
*        KNOW WHAT YOU'RE TRULY DOING


"Terms Of Use": ShowHide

*      1. Commercial use's always allowed and crediting me's always optional.
*      2. You shall keep this plugin's Plugin Info part's contents intact.
*      3. You shalln't claim that this plugin's written by anyone other than
*        DoubleX or my aliases. I always reserve the right to deny you from
*        using any of my plugins anymore if you've violated this.
*      4. If you repost this plugin directly(rather than just linking back),
*        you shall inform me of these direct repostings. I always reserve
*        the right to request you to edit those direct repostings.
*      5. CC BY 4.0, except those conflicting with any of the above, applies
*        to this plugin, unless you've my permissions not needing follow so.
*      6. I always reserve the right to deny you from using this plugin
*        anymore if you've violated any of the above.


"Contributors": ShowHide

*      Authors:
*      1. DoubleX
*      Plugin Development Collaborators:
*      - None So Far
*      Bug Reporters:
*      - None So Far
*      Compatibility Issue Raisers:
*      - None So Far
*      Feature Requesters:
*      - None So Far


"Changelog": ShowHide

*      { codebase: "1.1.0", plugin: "v1.00b" }(2020 Dec 2 GMT 0700):
 *      1. You no longer have to edit the value of
 *         DoubleX_RMMZ.Custom_Script_Calls.PLUGIN_NAME when changing this
 *         plugin file name
*      { codebase: "1.0.2", plugin: "v1.00a" }(2020 Sep 20 GMT 1400):
*      1. 1st version of this plugin finished


Download Link
Demo Link
14
While RMMZ has already released for about a month, the reviews are still mixed(64% positive among 225 reviews), at least according to Steam(I failed to find any other quantified reviews of comparable significance yet).
Although the overall score shows a slight upward trend overall, it still doesn't seem to look good, at least compared to RMMV, where it received 108 positives and 27 negatives, netting a 80% score, with a much more obvious upward trend later on.

The most obvious thing that can be done for those having bought RMMZ via Steam, is to give a positive review with solid reasons, like what I've given quite a while ago :)
But, maybe more can be done to further boost the review scores legitimately, apart from another obvious thing that resource makers can continue to make more and more awesome resources for the community :D

I've also briefly checked the NEGATIVE REVIEWS FROM STEAM, and here are the summary of all the points I've collected(which is by no means exhaustive):
Spoiler: ShowHide

1. The base price of RMMZ is too expensive compared to what it added and improved over RMMV(But they'd be positive for RMMZ if there will be a big sale)
2. RMMZ isn't even RMMVA, but just RMMV 1.7, because everything "new" in RMMZ are already provided by plugins in RMMV
3. RMMZ improved too little from RMMV, meaning that the RM franchise has become trapped in the past
4. The 3D effekseer doesn't work well with the RMMZ animations, because it's a 2D engine
5. The RMMZ RTP is worse than that of RMMV(images are ugly, audios are unpleasant to listen to, etc), and the former isn't compatible with the latter
6. There are still some unnecessarily hardcoded assumptions, like the tileset size still being fixed to 48
7. RMMZ doesn't work well when the screen size isn't 816 * 624(1280 * 720 can already cause the side view battler sprites to be mis-positioned to the left of the screen), like, ugly scaling of battler sprites
8. The RMMZ character generator still sucks so hard that the generated adults look like kids
9. There's no way to make porting RMMV animations to RMMZ an easy, simple and small task, because of effekseer
10. RMMZ still doesn't make good use of multiple CPU cores nor the GPU, causing inferior performance even with the Pixi v5 upgrades and other performance optimizations over RMMV
11. RMMZ only lets you use 4 map layers, which is far from being enough
12. The hardcoded limit of 2000 items per database type isn't high enough
13. The sprites are still hardcoded to using 3 frame per action
14. There's no way to make exporting to mobile platforms an easy, simple and small task, when RMMZ is advertised for optimized for such platforms
15. Many features that are provided by RMMZ plugins should've been done by RMMZ itself
16. The audio loading still isn't optimized in RMMZ, causing large audio files to have too long to load(and this issue already exists in RMMV and is well-known by the community for years)
17. The amount of resources including by the RTP still isn't large enough, and should've been much, much larger
18. While this engine advertise itself as easy enough for a child, it's not the case when you've to learn effekseer, which is a must to use RMMZ
19. An exported project can be as big as way more than 200MB in RMMZ, while similar projects in RMMV would've been just around 50MB, and 50MB is already too much
20. Sometimes the engine can just suddenly crash, like when clicking edit on a show text event, causing unexpected loss of progresses
21. The default RMMZ JavaScript codebase is so poorly-documented that documentation there is effectively nonexistent
22. The RMMZ is obviously very, very unpolished and just rushed for launch, and the current state of RMMZ is clearly an incomplete product
23. In general, the RMMZ plugins aren't as generous as the RMMV counterparts, because of the pricing, terms of use, and source code accessibility, and RMMZ is nothing without plugins
24. Enemy skill animations aren't displayed in front view battles
25. The battler sprites aren't animated enough, and they're behaving like static ones(no shadows, floating motions, etc)
26. RMMZ just isn't worth it before it has as many plugins as that of RMMV
27. Many improvements in RMMZ should've been implemented in RMMV
28. RMMZ should let you use either effekseer or the traditional RMMV like animations
29. The RM franchise has been working in the form of buying the engine with the use of many scripts/plugins from the same scripter/plugin developer(without him/her RM would be nothing), with tweaks of those scripts/plugins made, and some other scripts/plugins(that are compatible to those made by that particular scripter/plugin developer) from the other scripters/plugin developers to make games, but this formula no longer works in RMMZ, because of the successor of that particular scripter/plugin developers start making closed-source plugins in RMMZ(and some of them are paid too)

Please note that I'm just trying to summarize the points I've collected from negative Steam reviews, and it has nothing to do with whether I agree or disagree with any of them.

So, I'd like to open this post to collect ideas on some possible ways to make RMMZ to have overwhelming positive reviews, and this doesn't have to be limited to Steam, because I think later on there will be some other quantified reviews of comparable significance ;)
15
DoubleX RMMZ Auto Battle Command
Authors: DoubleX
Version: v1.00b
Type: Auto Battle Command Add-on
Key Term: Battle Add-on

Purpose
Adds a party command to add an autobattle state to the party in battles

Video


Games using this plugin
None so far

"Parameters": ShowHide

* @param stateId
* @type number
* @min 1
* @desc Sets the id of the state added by the auto battle command
* All alive members in the party will have this state added
* @default 7
*
* @param text
* @type string
* @desc Sets the auto battle command name
* The command will appear in the party command window
* @default Auto Battle
*
* @param canUse
* @type boolean
* @desc Sets whether the auto battle command can be used
* It'll be checked whenever the party command window's shown
* @default true


"Plugin Commands": ShowHide

*      1. setAutoBattleCmdState stateId
*        - Sets the id of the state added by the auto battle command as
*          stateId
*      2. setAutoBattleCmdText text
*        - Sets auto battle command name as text
*      3. setCanUseAutoBattleCmd canUse
*        - Sets whether the auto battle command can be used as canUse
*        - canUse must be either true or false


"Prerequisites": ShowHide

Plugins:
1. DoubleX RMMZ Enhanced Codebase
Abilities:
1. Nothing special


"Terms Of Use": ShowHide

*      1. Commercial use's always allowed and crediting me's always optional.
*      2. You shall keep this plugin's Plugin Info part's contents intact.
*      3. You shalln't claim that this plugin's written by anyone other than
*        DoubleX or my aliases. I always reserve the right to deny you from
*        using any of my plugins anymore if you've violated this.
*      4. If you repost this plugin directly(rather than just linking back),
*        you shall inform me of these direct repostings. I always reserve
*        the right to request you to edit those direct repostings.
*      5. CC BY 4.0, except those conflicting with any of the above, applies
*        to this plugin, unless you've my permissions not needing follow so.
*      6. I always reserve the right to deny you from using this plugin
*        anymore if you've violated any of the above.


"Contributors": ShowHide

*      Authors:
*      1. DoubleX
*      Plugin Development Collaborators:
*      - None So Far
*      Bug Reporters:
*      - None So Far
*      Compatibility Issue Raisers:
*      - None So Far
*      Feature Requesters:
*      - None So Far


"Changelog": ShowHide

*      { codebase: "1.1.0", plugin: "v1.00b" }(2020 Dec 2 GMT 0400):
 *      1. You no longer have to edit the value of
 *         DoubleX_RMMZ.Auto_Battle_Command.PLUGIN_NAME when changing this
 *         plugin file name
*      { codebase: "1.0.2", plugin: "v1.00a" }(2020 Sep 14 GMT 0900):
*      1. 1st version of this plugin finished


Download Link
Demo Link
16
DoubleX RMMV Action Input Timer
Authors: DoubleX
Version: v1.00a
Type: Battle Action Input Add-on
Key Term: Battle Add-on

Purpose
Lets you sets a timer that will cause all actors not inputted actions yet to have their turns skipped in turn based battles

Video


Games using this plugin
None so far

"Parameters": ShowHide

 * @param timerLimit
* @type number
* @desc Sets the number of seconds the players are allowed to input
* all actions of all inputable actors
* @default 20
*
* @param timerWinX
* @type number
* @desc Sets the x position of the action input timer window
* The smaller the number the more left the window is
* @default 0
*
* @param timerWinY
* @type number
* @desc Sets the y position of the action input timer window
* The smaller the number the more upper the window is
* @default 0
*
* @param timerWinW
* @type number
* @desc Sets the width of the action input timer window
* You've to test this yourselves to find a suitable value
* @default 240
*
* @param timerWinDesc
* @type string
* @desc Sets the action input timer window description text
* %1 is the number of seconds remaining of the input timer
* @default %1s input time


"Script Calls": ShowHide

*    # Battle manipulations
*      1. BattleManager.setActionInputTimer(timerLimit)
*         - Sets the current action input timer in battle as timerLimit
*           seconds
*         - The script call has no meaning outside battles
*         - The script call's supposed to be Idempotent
*    # Parameter manipulations
*      1. $gameSystem.actionInputTimerParam(param)
*         - Returns the value of specified parameter stored in game save
*           files
*         - param can be either of the following:
*           timerLimit
*           timerWinX
*           timerWinY
*           timerWinW
*           timerWinDesc
*         - The script call's supposed to be Nullipotent
*      2. $gameSystem.setActionInputTimerParam(param, val)
*         - Sets the value of the specified parameter stored in game save
*           files as val
*         - param can be either of the following:
*           timerLimit
*           timerWinX
*           timerWinY
*           timerWinW
*           timerWinDesc
*         - For any parameter other than timerWinDesc, the script call will
*           be ignored if val isn't a Number
*         - The script call's supposed to be Idempotent
*         - The new value of the specified parameter will be stored in game
*           save files


"Plugin Commands": ShowHide

*      1. setActionInputTimer timerLimit
*         - Applies the script call
*           BattleManager.setActionInputTimer(timerLimit)
*      2. setActionInputTimerParam param val
*         - Applies the script call
*           $gameSystem.setActionInputTimerParam(param, val)


"Prerequisites": ShowHide

*      Abilities:
*      1. Nothing special for most ordinary cases
*         (No capability on Javascript ES5 experience but can still make
*         reasonable guesses on readable novice codes up to 100 LoC scale)
*      2. Little RMMV plugin development proficiency to fully utilize this
*         plugin in intended ways
*         (Elementary Javascript ES5 exposures being able to write beginner
*         codes up to 300LoC scale )


"Terms Of Use": ShowHide

*      1. Commercial use's always allowed and crediting me's always optional.
*      2. You shall keep this plugin's Plugin Info part's contents intact.
*      3. You shalln't claim that this plugin's written by anyone other than
*         DoubleX or my aliases. I always reserve the right to deny you from
*         using any of my plugins anymore if you've violated this.
*      4. If you repost this plugin directly(rather than just linking back),
*         you shall inform me of these direct repostings. I always reserve
*         the right to request you to edit those direct repostings.
*      5. CC BY 4.0, except those conflicting with any of the above, applies
*         to this plugin, unless you've my permissions not needing follow so.
*      6. I always reserve the right to deny you from using this plugin
*         anymore if you've violated any of the above.


"Instructions": ShowHide

 *      1. The default plugin parameters file name is
*         doublex rmmv action input timer v100a
*         If you want to change that, you must edit the value of
*         DoubleX_RMMV.Action_Input_Timer_File, which must be done via
*         opening this plugin js file directly


"Contributors": ShowHide

*      Authors:
*      1. DoubleX
*      Plugin Development Collaborators:
*      - None So Far
*      Bug Reporters:
*      - None So Far
*      Compatibility Issue Raisers:
*      - None So Far
*      Feature Requesters:
*      - None So Far


"Changelog": ShowHide

 *      v1.00a(GMT 0500 6-Sep-2020):
*      1. 1st version of this plugin finished


Download Link
17
DoubleX RMMZ Plugin Command Lines
Authors: DoubleX
Version: v1.03b
Type: Plugin Command Add-on
Key Term: Misc Add-on

Purpose
Lets you use plugin commands in the RMMV styles by typing them as scripts

Introduction

*      1. The RMMZ editor has changed the plugin command from entering a
 *        single line of string command to selecting plugin commands among
 *        all plugins having plugin commands
 *      2. With this plugin, those preferring the RMMV plugin command can
 *        replicate this style in RMMZ by typing plugin command as a script

Video

Games using this plugin
None so far

"Parameters": ShowHide

 *      1. Lets you type plugin commands with names having spaces


"Parameters": ShowHide

 * @param pluginFileCmds
 * @type struct<PluginFileCmd>[]
 * @desc Sets the list of plugin commands to be called in RMMV ways
 * This being empty means all plugin commands to be that way
 * @default []
 *
 * @param newPluginFileCmds
 * @type struct<NewPluginFileCmd>[]
 * @desc Sets list of new plugin commands to be called in RMMV way
 * They're existing ones with some argument value already set
 * @default []


"RMMV Style Plugin Command Lines Info": ShowHide

 *    1. General form
 *      cmdName argName1 argName2 argName3 argNameI argNameN
 *      E.g.:
 *      - If the plugin command has its command name as abcdefg and arguments
 *        as h, i, j and k, then the RMMV style plugin command line is
 *        abcdefg h i j k
 *    2. (v1.02a+)pluginFileCmds
 *      - If there's only a small number of plugin commands among all enabled
 *        plugins, then whether the parameter pluginFileCmds should be filled
 *        doesn't matter much
 *      - If there's a large number of plugin commands among all enabled
 *        plugins, but only a small number of them being used in the RMMV
 *        styles, then pluginFileCmds should be filled with all those plugin
 *        commands, or the time needed for this plugin to load such a large
 *        number of plugin commands automatically upon game start can lead to
 *        a long game starting time
 *      - If there's a large number of plugin commands among all enabled
 *        plugins, and most of them being used in the RMMV styles, then I'm
 *        afraid that this plugin won't be able to give you a nice option
 *    3.(v1.02a+) newPluginFileCmds
 *      - Its 1st application is to let you type less, thus making using
 *        plugin commands in the RMMV styles to be even more effective and
 *        efficient
 *      - Its 2nd application is to let you use plugin commands with
 *        different argument values given on 2 different timings, without the
 *        need of game variables to store them, even though you'll have to
 *        redefine the new plugin commands on the 1st timing
 *      - Its 3rd application is to resolve plugin command name collisions
 *        among different plugins


Script Calls
 *      1. $gameSystem.setNewPluginCmd(pluginFilename, newCmdName, origCmdName, argNameVals)
 *        - Sets the new plugin command with name newCmdName as that with
 *          name origCmdName but with argument values already set by
 *          argNameVals, and origCmdName is the one in plugin with filename
 *          pluginFilename
 *        - argNameVals is an Object with argument names as keys and values
 *          of those arguments already set in newCmdName as values
 *        - E.g.:
 *          $gameSystem.setNewPluginCmd("DoubleX RMMZ Skill Item Cooldown", "ssicA1", "setSkillItemCooldown", {
 *              side: "actor",
 *              label: 1
 *          }) sets the new plugin command with name ssicA1 as that with name
 *          setSkillItemCooldown of plugin with filename
 *          DoubleX RMMZ Skill Item Cooldown but with the side and label
 *          argument values already set as "actor" and 1 respectively

"Author Notes": ShowHide

 *      1. If a plugin command's inputted as a script call, it must only take
 *        exactly 1 line for that plugin command
 *      2. Multiple plugin commands, each taking 1 line, can be inputted into
 *        the same script box in the editor, but do note that the size of
 *        that script box's limited so don't type too many plugin commands in
 *        the same script box in the editor
 *      3. If multiple plugin commands have the same name, the one having a
 *        highest ordering in pluginFileCmds will be used(or if
 *        pluginFileCmds is empty, the one from the plugin with the highest
 *        ordering will be used)
 *        (Search tag: First_In_Duplicate_Plugin_Cmds)
 *      4. If script calls and plugin commands are mixed in the same script
 *        box in the editor, script calls separated by plugin commands there
 *        will be called separately
 *        E.g.:
 *        - The following contents in the same script box in the editor
 *          scriptLine1
 *          scriptLine2
 *          pluginCommandLine1
 *          scriptLine3
 *          scriptLine4
 *          Will cause the scripts combined from scriptLine1 and scriptLine2
 *          to be a separate script call from the script call of the scripts
 *          combined from scriptLine3 and scriptLine4


"Prerequisites": ShowHide

Plugins:
1. DoubleX RMMZ Enhanced Codebase
Abilities:
1. Basic knowledge on what RMMV plugin command does in general on the user level



"Contributors": ShowHide

*      Authors:
*      1. DoubleX
*      Plugin Development Collaborators:
*      - None So Far
*      Bug Reporters:
*      - None So Far
*      Compatibility Issue Raisers:
*      - None So Far
*      Feature Requesters:
*      - None So Far


"Changelog": ShowHide

*      { codebase: "1.1.0", plugin: "v1.03b" }(2020 Nov 27 GMT 0400):
 *      1. You no longer have to edit the value of
 *         DoubleX_RMMZ.Plugin_Command_Lines.PLUGIN_NAME when changing this
 *         plugin file name
 *      { codebase: "1.0.2", plugin: "v1.02a" }(2020 Sep 14 GMT 0700):
 *      1. Lets you use text instead of command for plugin command names
 *      2. Lets you use text instead of arg for plugin command argument names
 *      3. Plugin command name collisions across plugins will no longer exist
 *        if newPluginFileCmds is used wisely
 *      4. Explained some applications of newPluginFileCmds
 *      5. Renamed pluginCmds into pluginFileCmds
 *      6. Renamed newPluginCmds into newPluginFileCmds
 *      7. Increased the effectiveness and efficiency when reading plugin
 *        commands from the plugin file contents
 *      8. THIS UPDATE IS A BREAKING CHANGE ON THE PARAMETERS IN THE PLUGIN
 *        MANAGER
 *      { codebase: "1.0.0", plugin: "v1.01a" }(2020 Sep 11 GMT 1400):
 *      1. Lets you make some new plugin commands as existing ones with some
 *        argument values already set
 *      2. Fixed the bug to load even inactive plugins and those not in the
 *        plugin manager when the parameter pluginCmds is empty
*      { codebase: "1.0.0", plugin: "v1.00a" }(2020 Sep 4 GMT 0600):
*      1. 1st version of this plugin finished


Download Link
Demo Link
18
DoubleX RMMV Superlative ATB
Authors: DoubleX
Version: v0.15c
Type: Active Time Battle System
Key Term: Custom Battle System

Note
While this plugin's already fully functional, there are still many more modules to be implemented, so the feature set isn't complete yet.

Purpose
To be the most flexible, performant and powerful ATB system framework with the greatest amount of freedom while being user-friendly

Introduction
*    1. This plugin aims to be the most flexible, performant and powerful
 *      ATB system with the greatest amount of freedom for users to fulfill
 *      as many functional needs as they want in as many ways as they want
 *    2. You may want to treat this as a nano ATB framework as part of the
 *      system's written by you via parameters/configurations/notetags/calls
 *    3. Almost every parameters and notetags can be written as direct
 *      JavaScript, thus giving you the maximum amount of control over them
 *    4. (VERY ADVANCED)You can even change most of those JavaScript codes
 *      written by you on the fly(and let your players do so with a system
 *      settings plugin), but you should only do so if you really know what
 *      you're truly doing

"Video": ShowHide




Games using this plugin
None so far

"Finished Modules": ShowHide

*      1. Core Module
*        - Lets you enable and disable this plugin on the fly
*        - Lets you define the battle turn in terms of number of actions
*          executed, or frames/seconds elapsed
*        - Lets you set the maximum ATB value of each battler
*        - Lets you set some states to have their turn counts updated right
*          before the battler involved executes actions
*      2. (v0.03a+)Bar Module
*        - Lets you show the battler ATB bars on the battler sprites
*        - Lets you show the actor ATB bars attached to the status window
*      3. (v0.01a+)Hotkey Module
*        - Lets you set some hotkeys to change the currently selected
*          inputable actors
*      4. (v0.02a+)Wait Module
*        - Lets you set the ATB frame update wait conditions
*        - Lets you show the ATB frame update force status
*        - Lets you set some hotkeys to forcibly run/stop the ATB frame
*          updates
*        - Lets you show some clickable command windows behaving like the
*          aforementioned hotkeys
*      5. (v0.04a+)Charge Module
*        - Lets you set some skills/items to need to be charged before being
*          executed
*        - Lets you set some hotkeys to cancel the action being charged(this
*          applies to those not needing charging as well if the players
*          cancel fast enough)
*        - Lets you set some hotkeys to force the action charge so it can be
*          executed before the charge's full or overcharged beyond the
*          maximum charge value
*      6. (v0.05a+)Cooldown Module
*        - Lets you set some skills/items to cause the battler involved need
*          to be cooled down after executing those skills/items
*        - Lets you set some hotkeys to cancel the the battler cooldown
*      7. (v0.12a+)Countdown Module
*          - Lets you set some states to have their turn count updated based
*            on the number of frames/seconds elapsed, with additional effects
*            triggered upon each turn count update
*      8. (v0.13a+)CTB Module
*          - Lets you change toggle the battle system between ATB and CTB on
*            the fly and even during the same battle(you can actually set a
*            hotkey to do that in battle)
*      9. (v0.15a+)Delay Module
*        - Lets you set the amount of delay between becoming able to input
*          actions and actually inputting them for battlers can't have their
*          actions inputted by the player(enemies and actors with auto
*          battle or confusion)
*      10. (v0.06a+)Event Module
*          - Lets you set some additional events to be triggered upon
*            important timings inthe ATB system
*      11. (v0.14a+)Order Module
*        - Lets you show the ATB values of all battlers in the same ATB bar
*        - Lets you show the battler action ordering in the CTB system style
*          (You should only use this with the full wait mode unless you
*          really know what you're truly doing)
*      12. (v0.10a)Rate Module
*          - Lets you set the ATB, charge and cooldown fill rate for each
*            battler
*      13. (v0.07a+)Reset Module
*          - Lets you set the ATB value of each battler right after that
*            battler has executed an action and becomes out of virtual action
*            slots
*      14. (v0.08a+)Speed Module
*          - Lets you set the action execution priority among all battlers
*            being able to execute actions(it likely means next to nothing in
*            the full wait mode)
*      15. (v0.09a+)Start Module
*          - Lets you set the starting ATB value upon normal, preemptive and
*            surprise battle starts
*      16. (v0.11a+)Turn Module
*          - Lets you show the progress of the current battle turn


"Upcoming Modules": ShowHide

*      1. Exchange Module
*        - Lets you set some skills/items to exchange the charging
*          skill/item of the targets with the cooldown of the action
*          exeuction subject triggering the exchange
*        - This can apply to skills/items with multiple targets but the
*          setup can be very complicated and convoluted this way
*      2. Status Module
*        - Shows the charge, cooldown, action cost and ATB reset settings
*          for each skill/item in battle and outside battle
*        - Shows the ATB statues for each actor in the actor status window
*          outside battle
*      3. Action Module
*        - Lets you set the number of virtual action slots needed for
*          skills/items
*        - Lets you demands players to input all the virtual action slots at
*          once before executing them all as a batch
*        - Lets you set how the virtual action slots are gained(gain all
*          upon a single full ATB or gain 1 upon each full ATB then empties
*          the ATB afterwards until the number of virtual action slots
*          reaches the limited specified by Action Times+)
*        - Lets you abandon the concept of virtual action slots altogether
*          and base the action cost in the form of subtracting the battler
*          ATB value
*      4. Combo Module
*        - Lets you set some charging skills/items made by different
*          battlers to form a new combo skills under certain conditions
*      5. Escape Module
*        - Lets you set the conditions allowing party escape attempt
*        - Lets you set the charging requirements for the party escape
*          attempt
*        - Lets you set the cooldown requirements for the failed party
*          escape attempt
*        - Lets you set the cost for failed party escape attempts
*      6. Overload Module
*        - Lets you sets the ATB value of battlers to be beyond their
*          maximum, but it'll slowly drop until it's dropped to its maximum
*      7. Pool Module
*        - Lets you bind some battlers to share the same ATB pool
*      8. Unison Module
*        - Lets you set some skills/items to be unison ones


"Addressed Foreign Plugins": ShowHide

*    # MOG_BattleHud:
*      In general, this plugin should be placed above the SATB implementation
*      plugin unless actual test results prove the otherwise
*      1. The ATB bar doesn't gather any DoubleX RMMV Superlative ATB data
*        - Reference tag: MOG_BattleHud_SATBData
*        - Extended Battle_Hud.prototype.at and Battle_Hud.prototype.max_at
*          to support the current and maximum ATB values of battlers
*        - Disabled Battle_Hud.is_casting without the Charge Module enabled
*        - (v0.03a+)Edited Battle_Hud.prototype.update_at to show the
*          ATB cooldown ATB as well
*        - (v0.03a+)Added Battle_Hud.prototype.is_cooldown to check if the
*          battler's cooling down
*      2. The original status window will be shown when the current inputable
*        actor becomes not inputable
*        - Reference tag: MOG_BattleHud_StopShowingStatusWindow
*        - Extended
*          DoubleX_RMMV.SATB.Scene_Battle.new._deselectOpenStatusWin to stop
*          showing the status window upon the aforementioned event
*      3. The actor window isn't fully shown
*        - Reference tag: MOG_BattleHud_Actor_Window
*        - Removed DoubleX_RMMV.SATB.Scene_Battle.new._updateActorWinPos to
*          let MOG_BattleHud handle the actor window position
*    # (v0.04a+)SEK_ChangeActor:
*      In general, this plugin should be placed just above the SATB
*      compatibility plugin unless actual test results prove the otherwise
*      1. The ATB of all actors are reset when swapping actors and the actor
*        input window won't update properly after swapping actors
*        - Reference tag: SEK_ChangeActor_StopRemoveAddAllPartyMems
*        - Rewritten Game_Party.prototype.swap to stop removing/adding
*          actors that aren't involving in the swapping
*      2. The actor being swapped in starts charging instantly without
*        inputting an action first
*        - Reference tag: SEK_ChangeActor_StopJumpNextCmd
*        - Disabled Scene_Battle.prototype.jumpNextCommand when this
*          plugin's enabled
*      3. The party command window doesn't show when upon cancel changing
*        actors after displaying a game message
*        - Reference tag: SEK_ChangeActor_SetupPartyCmdWin
*        - Extended Scene_Battle.onChangeCancel to setup the party command
*          window instead of just activating it
*      4. The change window corrupts the selection index whenever a battler
*        refreshes(execute actions, be hit, have states removed, etc)
*        - Reference tag: SEK_ChangeActor_FixDirectIndexSet0
*        - Extended Window_ChangeList.prototype.drawItem to restores the
*          selection before being corrupted
*      5. The input windows including the changing window don't refresh, hide
*        or show as expected when the ATB frame update isn't full wait
*        - Reference tag: SEK_ChangeActor_RefreshInputWins
*        - Extended Scene_Battle.prototype.refreshSATBInputWins,
*          Scene_Battle.prototype.onChangeOk,
*          DoubleX_RMMV.SATB.Scene_Battle.new._isWinWithNoInputtingActorActive,
*          DoubleX_RMMV.SATB.Scene_Battle.new._closeDeactivatePartyCmdWin,
*          DoubleX_RMMV.SATB.Scene_Battle.new._displayWinWithNoInputtingActor
*          and DoubleX_RMMV.SATB.Scene_Battle.new._hideSelectionWins to
*          refresh, hide and show the right input windows at the right time
*    # Yanfly Engine Plugins - Battle Engine Core:
*      In general, this plugin should be placed above the SATB implementation
*      plugin unless actual test results prove the otherwise
*      1. No actions can be executed in the 1st turn
*        - Reference tag: YEP_BattleEngineCore_Stop1stTurnCheck
*        - Extended BattleManager.getNextSubject to remove the turn count
*          check
*      2. Valid actions don't execute at all
*        - Reference tag: YEP_BattleEngineCore_HandleNewPhases
*        - Extended BattleManager.updateSATBAct to handle new action
*          sequence phases added by
*          Yanfly Engine Plugins - Battle Engine Core
*      3. Actors with more than 1 virtual action slots can only act once
*        - Reference tag: YEP_BattleEngineCore_AddNewActPhases
*        - Extended BattleManager.endAction to stop calling onAllActionsEnd
*          for the action execution subject
*        - Extended DoubleX_RMMV.SATB.BattleManager.new._isActPhase to
*          regard new action sequence phases as action phase
*      4. All battler actions are recreated upon starting actor inputs
*        - Reference tag: YEP_BattleEngineCore_StopRecreateAction
*        - Stopped calling BattleManager.createActions when SATB's effective
*      5. The sprite of the currently inputable actor will return to its home
*        position when any action performs its finish sequence
*        - Reference tag: YEP_BattleEngineCore_StopInputableActorReturnHome
*        - Extended Game_Battler.prototype.spriteReturnHome to disable this
*          function for the currently inputable actor
*      6. (v0.01a+)New inputting actors can't be selected by touching the
*        actor sprite unlike what happens when selecting actor or enemy
*        targets
*        - Reference tag: YEP_BattleEngineCore_TouchActorChangeSelected
*        - Extended startPartyCommandSelection to fallback to the default
*          rather than the extended YEP_BattleEngineCore version
*        - Both Mouse Over and Visual Actor Select should be on to have this
*          new inputable actor selection effect
*      7. The inputting actor has the wrong pose during party escape attempts
*        - Reference tag: YEP_BattleEngineCore_PartyCmdSelectStopNextCmd
*        - Extended startPartyCommandSelection to fallback to the default
*          rather than the extended YEP_BattleEngineCore version
*      8. The selection and help window lost info after refresh
*        - Reference tag: YEP_BattleEngineCore_UpdateSelectionHelpWindow
*        - Extended refreshSATBInputWins to reselect the selection windows
*          and update their respective help windows
*      9. The target help window remains when the actor's dead
*        - Reference tag: YEP_BattleEngineCore_CloseInvalidTargetHelpWindow
*        - Extended
*          DoubleX_RMMV.SATB.Scene_Battle.new._deactivateHideSelectionWins
*          to close the stale help window
*      10.(v0.02a+) The targets are wrongly shown as selected after inputting
*          a skill selecting all targets
*          - Reference tag: YEP_BattleEngineCore_ClearTargetSelections
*          - Extended DoubleX_RMMV.SATB.Scene_Battle.new._selectNextCmd to
*            clear the stale target selections


"Possibly Upcoming Modules": ShowHide

*      1. Type Module
*        - Lets you have multiple ATB bars for each battler
*        - THIS MODULE MUST BE THE LAST MODULE TO BE DONE AS IT'LL CHANGE
*          JUST ABOUT EVERYTHING IN THIS PLUGIN AND THUS AFFECTS ALMOST
*          EVERYTHING IN EVERY OTHER MODULE


"Todo": ShowHide

*      1. Adds _isSaveParamNotes
*      2. Fixes the actor command window not selecting the last command when
*        it becomes able to be shown again bug
*      3. Allows party escape attempts when executing actions
*      4. Lets players cancels actor cooldown by clicking the actor sprite
*      5. Lets players cancels actor charge by clicking the actor sprite
*      6. Lets players forces actor charge by long pressing the actor sprite
*      7. Lets you set some skills to demand a set period to charge up before
*        they become usable actions that can be inputted by battlers
*      8. Lets you set some skills to demand a set period to cool down before
*        they become usable actions that can be inputted by battlers again
*      9. Adds a parameter for each sprite/window class to be called per
*        frame so you can control which parameter cache to be
*        enabled/disabled
*      10. Fixes the discrete order battler sprite position bugs when the
*          battler changes again before the current position changes are
*          complete
*      11. Fixes the autobattle actor freezed charge/cooldown with the Delay
*          module enabled
*      12. Fixes the compatibility issues/bugs when the CTB Module interacts
*          with SEK_ChangeActor


"Inherited Behaviors From The Default RMMV Battle System": ShowHide

*      Action Speed:
*      1. The battlers that are ready to execute actions will be pushed into
*        the First-In-First-Out action execution queue, which is sorted by
*        the speed of the action to be executed by the battlers descendingly
*      2. To ensure battlers with extremely slow actions can still execute
*        them, the action speed of all battlers in the action execution
*        queue will be added by the 2000(the maximum action speed in the
*        default RMMV editor) divided by the number of battlers in that
*        queue, meaning that the longer the battler's in the queue, the more
*        such action speed bonuses will be received by that battler, so that
*        battler will be placed more and more up front in the queue
*      3. All these can be changed in the Speed Module
*      Action Times+(Not fully applicable with the Action Module enabled):
*      1. Every battler always has at most 1 real action slot, meaning that
*        each battler can only input 1 action at a time
*      2. A battler also has at most the number of virtual action slots equal
*        to the number of action slots with Action Times+ in the default
*        RMMV battle system
*      3. When a battler's no virtual action slot and becomes able to input
*        actions, Action Times+ will be used to determine the new number of
*        virtual action slots
*      4. When a battler has finished executing an action, the number of
*        virtual action slot will be reduced by 1. If that battler still has
*        virtual action slots, then the ATB value of that battler won't be
*        reduced(technically, it's reduced by an extremely small amount) and
*        can immediately input actions again(unless the ATB value's changed
*        by some other reasons like battler script calls); If that battler
*        has no more virtual action slots, then the ATB value of that
*        battler will be cleared to become 0 or remain unchanged if it was
*        negative
*      Party Escape(Not fully applicable with the Action and/or Escape Module
*      enabled):
*      1. Each actor will have his/her/its virtual action slot reduced by 1
*        upon a failed party escape attempt, as if it were just another
*        normnal action costing 1 virtual action slot
*      2. However, failed escape attempts won't increase the battle turn
*        clock counter even if its unit is the number of actions executed
*      Agility(Not fully applicable with the Rate Module enabled):
*      1. The fill rate of the battler ATB value will be multiplied by the
*        agility of that battler divided by the average of those of all
*        battlers in the battle
*      States With Removal Timing As Action End(Not fully applicable with the
*      Countdown Module enabled):
*      1. The turn counter of such states will be reduced by 1 when the
*        battler owning these states have just finished executing an action
*      States With Removal Timing As Turn End(Not fully applicable with the
*      Countdown Module enabled):
*      1. The turn counter of such states will be reduced by 1 when the
*        battle turn counter increases by 1(i.e., the current turn ends)
*      Buff Turns Are Updated Upon Turn End Rather Than Action End
*      Battler ATB Value With Preemptive Battle Start(Not fully applicable
*      with the Start Module enabled):
*      1. The actor ATB value will be immediately fully filled while those of
*        enemies will be immediately empty
*      Battler ATB Value With Surprise Battle Start(Not fully applicable with
*      the Start Module enabled):
*      1. The enemy ATB value will be immediately fully filled while those of
*        actors will be immediately empty
*      Battler ATB Value With Normal Battle Start(Not fully applicable with
*      the Start Module enabled):
*      1. The ATB value of all battlers will be immediately empty
*      Battlers Becoming Hidden/Unmovable
*      1. Their ATB values will be reset to 0 if they're not negative before
*      2. Their number of virtual action slots will be reset to 0


"Current Technical Limitations": ShowHide

*      1. The ATB frame update can never be run when either of the following
*        conditions are met:
*        - The battle's starting, aborting or ending
*        - The game message's showing in the battle
*        - The battle event's running
*        Violating any of these conditions might outright crash the game
*      2. Party escape's always disabled when either of the following
*        conditions are met:
*        - The battler sprites/action animations are animating/playing
*        - The log window's displaying messages
*        - Battlers are executing actions
*        - The game message's showing in the battle
*        Violating any of these conditions might outright crash the game
*        (Actually it should also be disabled when battle event's running
*        but trying to enforce this's itself a current technical limitation)
*      3. Only 1 actor can input actions at a time
*        - Violating this, if possible to be compatible with this plugin,
*          would be implemented with a separate plugin
*      4. Only 1 battler can execute actions at a time
*        - Violating this, if possible to be compatible with this plugin,
*          would be implemented with a separate plugin
*      5. A battler can only execute 1 action at a time
*        - Violating this, if possible to be compatible with this plugin,
*          would be implemented with a separate plugin
*      6. Having too many effective notetags full of nondeterministic results
*        will lead to severe performance issues especially on android device
*      7. Having too many effective notetags calling extremely long functions
*        will lead to the save files being too big
*      8. In extremely rare cases, the actor action inputting commands might
*        be temporarily unresponsive for a very short time(It's to prevent
*        crashing the game instead in really weird cases I've truly faced)
*      9. Projects using this plugin with full active ATB mode and Bar Module
*        enabled can be hard to maintain 60FPS on mobile phones that aren't
*        especially powerful


"Author Notes": ShowHide

*      1. DoubleX RMMV Superlative ATB aims to give extreme control and
*        freedom to users by making it as flexible as I can with as little
*        damage to user-friendliness as I can
*      2. The configuration plugin is generally for more advanced uses, as
*        most ordinary cases should be covered by parameters and notetags
*      3. This is an advanced complex plugin, meaning that you're expected to
*        use the default parameters and configuration values first to be
*        familiar with playing the demo of this plugin before changing any
*        of those values and/or using any notetags
*      4. You might have to use some script calls in RMMV and some of those
*        provided by this plugin to realize some of the more advanced uses
*      5. If you want to keep things easy, simple and small, you may want to
*        use DoubleX RMMV Popularized ATB instead
*      6. If you want to run battle tests, you must open the configuration
*        plugin js file directly to setup everything that has to be setup
*        upon battle test start by changing the contents of the function
*        SATB.onSetupBattleTest
*        (It's especially useful when some parameters/notetags use some
*        game switches/variables which must all have their corresponding
*        values manually assigned first)
*      7. (Advanced)You might have to have a basic knowledge on what the
*        implementation plugin does in general to fully utilize this plugin
*        in intended ways and solid understanding on how this implementation
*        plugin works in details to fully utilize this plugin with creative
*        and unintended uses
*      8. (Advanced)You might have to read some new variables/functions to
*        have a basic knowledge on what they do in general in order to
*        realize some intended cases
*      9. (Advanced)You might have to dig into the mechanisms of some new
*        variables/functions to have a solid underatanding on how they work
*        alone in details in order to realize some unintended usages


"FAQ": ShowHide

*    Q1. What's the main differences between DoubleX RMMV Popularized ATB and
*        this plugin?
*    A1. There are at least 2 main differences:
*        - The former uses the core addon approach, meaning that the core
*          plugin, which is mandatory, will only have all the essential
*          features, and each addon plugin, which is optional, will only have
*          each set of extra features. This is useful when many users only
*          use a small amount of the feature set provided by
*          DoubleX RMMV Popularized ATB.
*          On the other hand, the latter uses the single plugin approach,
*          meaning that all the feature implementations will be included in a
*          single plugin, even though unit tests and compatibility fixes will
*          still be separate plugins. This is useful when many users use a
*          large amount of the feature set provided by this plugin.
*        - The former aims to be easy, simple and small while still being
*          reasonably powerful for both users and ATB system plugin
*          learners, while the latter aims to be the most flexible and
*          powerful ATB system plugin ever by giving users the deepest and
*          widest amount of control and freedom ever, thus making it much,
*          much more demanding for both users and ATB system plugin learners.
*    Q2. May you please make this plugin less demanding? The sheer number of
*        parameters/configurations/notetags, most demanding Javascript
*        function contents as values, are extremely overwhelming for less
*        capable users. It's just far from being user-friendly enough.
*    A2. While it's clearly my fault that makes this plugin so hard to use,
*        I've already tried my best while still preserving the flexibility
*        and power of thie plugin by maintaining the depth and width of
*        control and freedom available for users.
*        As for the sheer number of parameters/configurations/notetags, this
*        plugin aims to include everything in a single plugin, which is
*        preferred for some users.
*        In case this plugin's really too hostile, you may want to use
*        DoubleX RMMV Popularized ATB, which is much easier, simpler and
*        smaller while still being reasonably powerful, instead. Also, it
*        breaks each set of features into 1 plugin, meaning that you won't
*        have to face a sheer number of parameters/configurations/notetags
*        there.
*        Alternatively, you can ask for help if you still want to use this
*        plugin, if the demo doesn't provide enough help already.
*    Q3. Why the Core Module itself doesn't show the ATB value of any
*        battler and why doesn't it let players change among inputable
*        actors? All these are essential UX features. Without them, using
*        just the Core Module can only result in a fully broken ATB system.
*        (Well, not being able to change the ATB wait conditions sucks too)
*    A3. It's because these features aren't technically essential to run an
*        ATB system plugin, nor they're behaviors inherited from the default
*        RMMV battle system(It doesn't let you change the input sequence nor
*        show the actual action execution sequence). All these features that
*        are missing in the Core Module are covered in the Bar Module and
*        Hotkey Module(The similar logic applies to the Wait Module). That's
*        why only these 3 optional modules are enabled by default(All the
*        other optional modules are disabled so you don't have to deal with
*        so many modules all at once before being familiar with this plugin).
*    Q4. Why the Bar Module doesn't use notetags? Isn't it going against the
*        very goal of this plugin?
*    A4. It's because it's very unlikely that anyone will need to use such
*        notetags. If I added them anyway, the sheer number of notetags that
*        almost no one's going to use would be too much of a nuance and
*        clutter for users to access the functionalities that they really
*        want. In case such notetags are indeed needed, I'll implement the
*        needed ones, and perhaps one day all those notetags would be done.
*    Q5. (Advanced)Why the caching mechanism's so complicated and convoluted
*        in this plugin? It's extremely costly and troublesome to work around
*        when I've some unintended and creative uses of this plugin.
*    A5. It's because this plugin explicitly allows many effective notetags
*        to be used in the same frame, which can cause significant lag and
*        fps drop if the end result's not cached, epsecially when the
*        functions called by those notetags are computationally expensive.
*        This plugin's to balance among multiple key aspects, so I'm sorry
*        that your use cases have to be at least slightly sacrificed for
*        performance stability and ease of use for intended and ordinary use
*        cases, which are likely much more common and important. That's the
*        main reason why decent RMMV plugin development proficiency is needed
*        to fully utilize this plugin with creative and unintended uses.


"Prerequisites": ShowHide

*      Abilities:
*      1. Nothing special for most ordinary cases
*        (No capability on Javascript ES5 experience but can still make
*        reasonable guesses on readable novice codes up to 100 LoC scale)
*      2. Little RMMV plugin development proficiency for more advanced uses
*        (Elementary Javascript ES5 exposures being able to write beginner
*        codes up to 300LoC scale)
*      3. Some RMMV plugin development proficiency to fully utilize this
*        plugin in intended ways
*        (Basic knowledge on what RMMV plugin development does in general
*        with several easy, simple and small plugins written without
*        nontrivial bugs up to 1000 LoC scale but still being inexperienced)
*      4. Decent RMMV plugin development proficiency to fully utilize this
*        plugin with creative and unintended uses
*        (Solid understanding on how RMMV plugin development works on its
*        own in details with dozens of tolerable quality plugins written
*        without nontrivial bugs with some up to 3000 LoC scale and being
*        experienced)
*      Knowledge:
*      1. Basic knowledge on what the default RMMV editor does in general
*      2. Basic knowledge on what the default RMMV battle system does in
*        general on the user level
*      3. Basic knowledge on what an ATB system does in general



"Instructions": ShowHide

*      1. If you want to edit configurations instead of parameters, you must
*        open the configuration plugin js file to access those
*        configurations
*      2. If you want to keep the current parameter values in the plugin
*         manager upon using a newer parameter plugin version, you can rename
*         the newer one of the parameter plugin to be that of the older one
*      3. If you wish to use DoubleX RMMV Superlative ATB Unit Test, place it
*        right below DoubleX RMMV Superlative ATB Implementation


Demo
19
DoubleX RMMZ Skill Item Triggers
Authors: DoubleX
Version: v1.01a
Type: Skill Item Add-on
Key Term: Battle Add-on

Purpose
Lets you run some codes set by your notetags on some action execution cases

Introduction
 *    1. This plugin lets you use notetags to set what happens when an
 *      action's just executed, and different cases like miss, evade, counter
 *      attack, magic reflection, critical hit, normal execution, substitute,
 *      right before starting to execute actions, and right after finished
 *      executing the actions, can have different notetags
 *    2. You're expected to write JavaScript codes directly, as there are so
 *      much possibilities that most of them are just impossible to be
 *      covered by this plugin itself, so this plugin just lets you write
 *      JavaScript codes that are executed on some important timings

Video


Games using this plugin
None so far

Parameters
* @param missNotetagDataTypePriorities
 * @type select[]
 * @option Data of the actor
 * @value actor
 * @option Data of the current class
 * @value class
 * @option Data of learnt skills/action list(Shouldn't be used with Data of usable skills)
 * @value skills
 * @option Data of usable skills(Shouldn't be used with Data of learnt skills)
 * @value usableSkills
 * @option Data of possessed items(Shouldn't be used with Data of usable items)
 * @value items
 * @option Data of usable items(Shouldn't be used with Data of possessed items)
 * @value usableItems
 * @option Data of the latest skill/item being used(Can double-count with skills/items/usableSkills/usableItems)
 * @value latestSkillItem
 * @option Data of equipped weapons
 * @value weapons
 * @option Data of equipped armors
 * @value armors
 * @option Data of the enemy
 * @value enemy
 * @option Data of effective states
 * @value states
 * @desc Sets data type priorities of the miss notetags
 * You can use script calls/plugin commands to change this
 * @default ["latestSkillItem"]
 *
 * @param evaNotetagDataTypePriorities
 * @type select[]
 * @option Data of the actor
 * @value actor
 * @option Data of the current class
 * @value class
 * @option Data of learnt skills/action list(Shouldn't be used with Data of usable skills)
 * @value skills
 * @option Data of usable skills(Shouldn't be used with Data of learnt skills)
 * @value usableSkills
 * @option Data of possessed items(Shouldn't be used with Data of usable items)
 * @value items
 * @option Data of usable items(Shouldn't be used with Data of possessed items)
 * @value usableItems
 * @option Data of the latest skill/item being used(Can double-count with skills/items/usableSkills/usableItems)
 * @value latestSkillItem
 * @option Data of equipped weapons
 * @value weapons
 * @option Data of equipped armors
 * @value armors
 * @option Data of the enemy
 * @value enemy
 * @option Data of effective states
 * @value states
 * @desc Sets data type priorities of the eva notetags
 * You can use script calls/plugin commands to change this
 * @default ["latestSkillItem"]
 *
 * @param cntNotetagDataTypePriorities
 * @type select[]
 * @option Data of the actor
 * @value actor
 * @option Data of the current class
 * @value class
 * @option Data of learnt skills/action list(Shouldn't be used with Data of usable skills)
 * @value skills
 * @option Data of usable skills(Shouldn't be used with Data of learnt skills)
 * @value usableSkills
 * @option Data of possessed items(Shouldn't be used with Data of usable items)
 * @value items
 * @option Data of usable items(Shouldn't be used with Data of possessed items)
 * @value usableItems
 * @option Data of the latest skill/item being used(Can double-count with skills/items/usableSkills/usableItems)
 * @value latestSkillItem
 * @option Data of equipped weapons
 * @value weapons
 * @option Data of equipped armors
 * @value armors
 * @option Data of the enemy
 * @value enemy
 * @option Data of effective states
 * @value states
 * @desc Sets data type priorities of the cnt notetags
 * You can use script calls/plugin commands to change this
 * @default ["latestSkillItem"]
 *
 * @param mrfNotetagDataTypePriorities
 * @type select[]
 * @option Data of the actor
 * @value actor
 * @option Data of the current class
 * @value class
 * @option Data of learnt skills/action list(Shouldn't be used with Data of usable skills)
 * @value skills
 * @option Data of usable skills(Shouldn't be used with Data of learnt skills)
 * @value usableSkills
 * @option Data of possessed items(Shouldn't be used with Data of usable items)
 * @value items
 * @option Data of usable items(Shouldn't be used with Data of possessed items)
 * @value usableItems
 * @option Data of the latest skill/item being used(Can double-count with skills/items/usableSkills/usableItems)
 * @value latestSkillItem
 * @option Data of equipped weapons
 * @value weapons
 * @option Data of equipped armors
 * @value armors
 * @option Data of the enemy
 * @value enemy
 * @option Data of effective states
 * @value states
 * @desc Sets data type priorities of the mrf notetags
 * You can use script calls/plugin commands to change this
 * @default ["latestSkillItem"]
 *
 * @param criNotetagDataTypePriorities
 * @type select[]
 * @option Data of the actor
 * @value actor
 * @option Data of the current class
 * @value class
 * @option Data of learnt skills/action list(Shouldn't be used with Data of usable skills)
 * @value skills
 * @option Data of usable skills(Shouldn't be used with Data of learnt skills)
 * @value usableSkills
 * @option Data of possessed items(Shouldn't be used with Data of usable items)
 * @value items
 * @option Data of usable items(Shouldn't be used with Data of possessed items)
 * @value usableItems
 * @option Data of the latest skill/item being used(Can double-count with skills/items/usableSkills/usableItems)
 * @value latestSkillItem
 * @option Data of equipped weapons
 * @value weapons
 * @option Data of equipped armors
 * @value armors
 * @option Data of the enemy
 * @value enemy
 * @option Data of effective states
 * @value states
 * @desc Sets data type priorities of the cri notetags
 * You can use script calls/plugin commands to change this
 * @default ["latestSkillItem"]
 *
 * @param normNotetagDataTypePriorities
 * @type select[]
 * @option Data of the actor
 * @value actor
 * @option Data of the current class
 * @value class
 * @option Data of learnt skills/action list(Shouldn't be used with Data of usable skills)
 * @value skills
 * @option Data of usable skills(Shouldn't be used with Data of learnt skills)
 * @value usableSkills
 * @option Data of possessed items(Shouldn't be used with Data of usable items)
 * @value items
 * @option Data of usable items(Shouldn't be used with Data of possessed items)
 * @value usableItems
 * @option Data of the latest skill/item being used(Can double-count with skills/items/usableSkills/usableItems)
 * @value latestSkillItem
 * @option Data of equipped weapons
 * @value weapons
 * @option Data of equipped armors
 * @value armors
 * @option Data of the enemy
 * @value enemy
 * @option Data of effective states
 * @value states
 * @desc Sets data type priorities of the norm notetags
 * You can use script calls/plugin commands to change this
 * @default ["latestSkillItem"]
 *
 * @param substituteNotetagDataTypePriorities
 * @type select[]
 * @option Data of the actor
 * @value actor
 * @option Data of the current class
 * @value class
 * @option Data of learnt skills/action list(Shouldn't be used with Data of usable skills)
 * @value skills
 * @option Data of usable skills(Shouldn't be used with Data of learnt skills)
 * @value usableSkills
 * @option Data of possessed items(Shouldn't be used with Data of usable items)
 * @value items
 * @option Data of usable items(Shouldn't be used with Data of possessed items)
 * @value usableItems
 * @option Data of the latest skill/item being used(Can double-count with skills/items/usableSkills/usableItems)
 * @value latestSkillItem
 * @option Data of equipped weapons
 * @value weapons
 * @option Data of equipped armors
 * @value armors
 * @option Data of the enemy
 * @value enemy
 * @option Data of effective states
 * @value states
 * @desc Sets data type priorities of the substitute notetags
 * You can use script calls/plugin commands to change this
 * @default ["latestSkillItem"]
 *
 * @param preNotetagDataTypePriorities
 * @type select[]
 * @option Data of the actor
 * @value actor
 * @option Data of the current class
 * @value class
 * @option Data of learnt skills/action list(Shouldn't be used with Data of usable skills)
 * @value skills
 * @option Data of usable skills(Shouldn't be used with Data of learnt skills)
 * @value usableSkills
 * @option Data of possessed items(Shouldn't be used with Data of usable items)
 * @value items
 * @option Data of usable items(Shouldn't be used with Data of possessed items)
 * @value usableItems
 * @option Data of the latest skill/item being used(Can double-count with skills/items/usableSkills/usableItems)
 * @value latestSkillItem
 * @option Data of equipped weapons
 * @value weapons
 * @option Data of equipped armors
 * @value armors
 * @option Data of the enemy
 * @value enemy
 * @option Data of effective states
 * @value states
 * @desc Sets data type priorities of the pre notetags
 * You can use script calls/plugin commands to change this
 * @default ["latestSkillItem"]
 *
 * @param postNotetagDataTypePriorities
 * @type select[]
 * @option Data of the actor
 * @value actor
 * @option Data of the current class
 * @value class
 * @option Data of learnt skills/action list(Shouldn't be used with Data of usable skills)
 * @value skills
 * @option Data of usable skills(Shouldn't be used with Data of learnt skills)
 * @value usableSkills
 * @option Data of possessed items(Shouldn't be used with Data of usable items)
 * @value items
 * @option Data of usable items(Shouldn't be used with Data of possessed items)
 * @value usableItems
 * @option Data of the latest skill/item being used(Can double-count with skills/items/usableSkills/usableItems)
 * @value latestSkillItem
 * @option Data of equipped weapons
 * @value weapons
 * @option Data of equipped armors
 * @value armors
 * @option Data of the enemy
 * @value enemy
 * @option Data of effective states
 * @value states
 * @desc Sets data type priorities of the post notetags
 * You can use script calls/plugin commands to change this
 * @default ["latestSkillItem"]

Notetags
*    ## Notetag Info
 *      1. Among all the same notetag types in the same data, all can be
 *          effective
 *      2. Each line can only have at most 1 notetag
 *      3. The following is the structure of all notetags in this plugin:
 *          - <doublex rmmz skill item triggers contents>
 *          - <skill item triggers contents>
 *          Where contents are in the form of type suffixes: entries
 *          Either of the above can be used, but the 1st one reduce the chance
 *          of causing other plugins to treat the notetags of this plugin as
 *          theirs, while the 2nd one is more user-friendly
 *          - type is one of the following:
 *            1. miss
 *            2. eva
 *            3. cnt
 *            4. mrf
 *            5. cri
 *            6. norm
 *            7. substitute
 *            8. pre
 *            9. post
 *          - suffixes is the list of suffixes in the form of:
 *            suffix1 suffix2 suffix3 ... suffixn
 *            Where each suffix is either of the following:
 *            val(The notetag value will be used as-is)
 *            switch(The value of the game switch with id as the notetag value
 *                  will be used)
 *            event(The common event with id as the notetag value will be
 *                  reserved)
 *            (Advanced)script(The value of the game variable with id as the
 *                            notetag value will be used as the contents of
 *                            the functions to be called upon using the
 *                            notetag)
 *          - The this pointer of the script suffix is different for different
 *            notetag types
 *          - entries is the list of entries in the form of:
 *            entry1, entry2, entry3, ..., entryn
 *            Where entryi must conform with the suffixi specifications
 *----------------------------------------------------------------------------
 *    # Actor/Class/Learnt Skills/Usable Skills/Posessed Items/Usable Items/
 *      Inputted Skill Or Item/Weapon/Armor/Enemy/States/This State Notetags
 *      1. miss condSuffix eventSuffix: condEntry, eventEntry
 *        - Triggers what specified in eventEntry when the action involved
 *          just missed the target involved if condEntry returns a truthy
 *          result
 *        - condSuffix can be val, switch or script
 *        - eventEntry can be event or script
 *        - The result of condEntry can be anything as only whether it's
 *          truthy matters
 *        - If the result of condEntry is falsy, this notetag will be
 *          discarded upon such use cases
 *        - The result of eventEntry can be anything as it's supposed to run
 *          commands instead of returning results
 *        - The miss skill/item trigger also applies counter attack, but with
 *          the target involved being that being hit by the counter attack
 *        - The miss skill/item trigger also applies to magic reflection, but
 *          with the target involved being the action execution subject
 *          instead
 *        - (Advanced)The this pointer of the script suffix is the target
 *          involved
 *        - E.g.:
 *          <skill item triggers miss switch event: 1, 2> will reserve the
 *          common event with id 2 when the action involved just missed the
 *          target if the game switch with id 1 is on
 *      2. eva condSuffix eventSuffix: condEntry, eventEntry
 *        - Triggers what specified in eventEntry when the action involved is
 *          just evaded by the target involved if condEntry returns a truthy
 *          result
 *        - condSuffix can be val, switch or script
 *        - eventEntry can be event or script
 *        - The result of condEntry can be anything as only whether it's
 *          truthy matters
 *        - If the result of condEntry is falsy, this notetag will be
 *          discarded upon such use cases
 *        - The result of eventEntry can be anything as it's supposed to run
 *          commands instead of returning results
 *        - The eva skill/item trigger also applies counter attack, but with
 *          the target involved being that being hit by the counter attack
 *        - The eva skill/item trigger also applies to magic reflection, but
 *          with the target involved being the action execution subject
 *        - (Advanced)The this pointer of the script suffix is the target
 *          involved
 *        - E.g.:
 *          <skill item triggers eva val script: true, 3> will always run the
 *          JavaScript codes stored as a string in variable with id 3 when
 *          the action involved is just evaded by the target involved
 *      3. cnt condSuffix eventSuffix: condEntry, eventEntry
 *        - Triggers what specified in eventEntry when the action involved is
 *          just countered by the attack of the target involved if condEntry
 *          returns a truthy result
 *        - condSuffix can be val, switch or script
 *        - eventEntry can be event or script
 *        - The result of condEntry can be anything as only whether it's
 *          truthy matters
 *        - If the result of condEntry is falsy, this notetag will be
 *          discarded upon such use cases
 *        - The result of eventEntry can be anything as it's supposed to run
 *          commands instead of returning results
 *        - (Advanced)The this pointer of the script suffix is the target
 *          involved
 *        - E.g.:
 *          <skill item triggers cnt switch event: 1, 2> will reserve the
 *          common event with id 2 when the action involved is just countered
 *          by the attack of the target involved if the game switch with id 1
 *          is on
 *      4. mrf condSuffix eventSuffix: condEntry, eventEntry
 *        - Triggers what specified in eventEntry when the action involved is
 *          just reflected by the target involved if condEntry returns a
 *          truthy result
 *        - condSuffix can be val, switch or script
 *        - eventEntry can be event or script
 *        - The result of condEntry can be anything as only whether it's
 *          truthy matters
 *        - If the result of condEntry is falsy, this notetag will be
 *          discarded upon such use cases
 *        - The result of eventEntry can be anything as it's supposed to run
 *          commands instead of returning results
 *        - (Advanced)The this pointer of the script suffix is the target
 *          involved
 *        - E.g.:
 *          <skill item triggers mrf val script: true, 3> will always run the
 *          JavaScript codes stored as a string in variable with id 3 when
 *          the action involved is just reflected by the target involved
 *      5. cri condSuffix eventSuffix: condEntry, eventEntry
 *        - Triggers what specified in eventEntry when the action involved
 *          just critically hit the target involved if condEntry returns a
 *          truthy result
 *        - condSuffix can be val, switch or script
 *        - eventEntry can be event or script
 *        - The result of condEntry can be anything as only whether it's
 *          truthy matters
 *        - If the result of condEntry is falsy, this notetag will be
 *          discarded upon such use cases
 *        - The result of eventEntry can be anything as it's supposed to run
 *          commands instead of returning results
 *        - The cri skill/item trigger also applies counter attack, but with
 *          the target involved being that being hit by the counter attack
 *        - The cri skill/item trigger also applies to magic reflection, but
 *          with the target involved being the action execution subject
 *        - (Advanced)The this pointer of the script suffix is the target
 *          involved
 *        - E.g.:
 *          <skill item triggers cri switch event: 1, 2> will reserve the
 *          common event with id 2 when the action involved just critically
 *          hit the target involved if the game switch with id 1 is on
 *      6. norm condSuffix eventSuffix: condEntry, eventEntry
 *        - Triggers what specified in eventEntry when the action involved is
 *          just executed normally on the target involved if condEntry
 *          returns a truthy result
 *        - condSuffix can be val, switch or script
 *        - eventEntry can be event or script
 *        - The result of condEntry can be anything as only whether it's
 *          truthy matters
 *        - If the result of condEntry is falsy, this notetag will be
 *          discarded upon such use cases
 *        - The result of eventEntry can be anything as it's supposed to run
 *          commands instead of returning results
 *        - The norm skill/item trigger also applies counter attack, but with
 *          the target involved being that being hit by the counter attack
 *        - The norm skill/item trigger also applies to magic reflection, but
 *          with the target involved being the action execution subject
 *        - (Advanced)The this pointer of the script suffix is the target
 *          involved
 *        - E.g.:
 *          <skill item triggers norm val script: true, 3> will always run
 *          the JavaScript codes stored as a string in variable with id 3
 *          when the action involved is just executed normally on the target
 *          involved
 *      7. substitute condSuffix eventSuffix: condEntry, eventEntry
 *        - Triggers what specified in eventEntry when the action involved
 *          just hit the substitute instead of the original target involved
 *          if condEntry returns a truthy result
 *        - condSuffix can be val, switch or script
 *        - eventEntry can be event or script
 *        - The result of condEntry can be anything as only whether it's
 *          truthy matters
 *        - If the result of condEntry is falsy, this notetag will be
 *          discarded upon such use cases
 *        - The result of eventEntry can be anything as it's supposed to run
 *          commands instead of returning results
 *        - (Advanced)The this pointer of the script suffix is the substitute
 *          target involved but not the original target involved
 *        - E.g.:
 *          <skill item triggers substitute switch event: 1, 2> will reserve
 *          the common event with id 2 when the action involved just hit the
 *          substitute instead of the original target involved if the game
 *          switch with id 1 is on
 *      8. pre condSuffix eventSuffix: condEntry, eventEntry
 *        - Triggers what specified in eventEntry right before starting to
 *          execute the action involved if condEntry returns a truthy
 *          result
 *        - condSuffix can be val, switch or script
 *        - eventEntry can be event or script
 *        - The result of condEntry can be anything as only whether it's
 *          truthy matters
 *        - If the result of condEntry is falsy, this notetag will be
 *          discarded upon such use cases
 *        - The result of eventEntry can be anything as it's supposed to run
 *          commands instead of returning results
 *        - (Advanced)The this pointer of the script suffix is the action
 *          execution subject involved
 *        - E.g.:
 *          <skill item triggers pre switch event: 1, 2> will reserve the
 *          common event with id 2 before starting to execute the action
 *          involved if the game switch with id 1 is on
 *      9. post condSuffix eventSuffix: condEntry, eventEntry
 *        - Triggers what specified in eventEntry right after finished
 *          executing the action involved if condEntry returns a truthy
 *          result
 *        - condSuffix can be val, switch or script
 *        - eventEntry can be event or script
 *        - The result of condEntry can be anything as only whether it's
 *          truthy matters
 *        - If the result of condEntry is falsy, this notetag will be
 *          discarded upon such use cases
 *        - The result of eventEntry can be anything as it's supposed to run
 *          commands instead of returning results
 *        - (Advanced)The this pointer of the script suffix is the action
 *          execution subject involved
 *        - E.g.:
 *          <skill item triggers post val script: true, 3> will always run
 *          the JavaScript codes stored as a string in variable with id 3
 *          right after finished executing the action involved

Script Calls
 *    # Parameter manipulations
 *      1. $gameSystem.setSkillItemTriggersParam(param, val)
 *        - Sets the fully parsed value of the parameter param as val
 *        - param must be the name of a valid parameter of this plugin
 *        - val must be a valid new fully parsed value of the parameter param
 *        - Such parameter value changes will be saved
 *        - E.g.:
 *          $gameSystem.setSkillItemTriggersParam("missNotetagDataTypePriorities", [
 *              "latestSkillItem"
 *          ]) sets the fully parsed value of the parameter
 *          missNotetagDataTypePriorities as ["latestSkillItem"]
 *      2. $gameSystem.skillItemTriggersParam(param)
 *        - Returns the fully parsed value of the parameter param
 *        - param must be the name of a valid parameter of this plugin
 *        - E.g.:
 *          $gameSystem.skillItemTriggersParam("evaNotetagDataTypePriorities")
 *          returns the fully parsed value of the parameter
 *          evaNotetagDataTypePriorities, which should be ["latestSkillItem"]
 *          if it uses its default parameter value

Plugin Commands
 * @command setSkillItemTriggersParam
 * @desc Applies script call $gameSystem.setSkillItemTriggersParam(param, val)
 * @arg param
 * @desc The name of a valid parameter of this plugin
 * @arg val
 * @desc A valid new fully parsed value of the parameter param

Prerequisites
Plugins:
1. DoubleX RMMZ Enhanced Codebase
Abilities:
1. Some RMMV plugin development proficiency
(Basic knowledge on what RMMV plugin development does in general with several easy, simple and small plugins written without nontrivial bugs up to 1000 LoC scale but still being inexperienced)

Terms Of Use
*      1. Commercial use's always allowed and crediting me's always optional.
 *      2. You shall keep this plugin's Plugin Info part's contents intact.
 *      3. You shalln't claim that this plugin's written by anyone other than
 *        DoubleX or my aliases. I always reserve the right to deny you from
 *        using any of my plugins anymore if you've violated this.
 *      4. If you repost this plugin directly(rather than just linking back),
 *        you shall inform me of these direct repostings. I always reserve
 *        the right to request you to edit those direct repostings.
 *      5. CC BY 4.0, except those conflicting with any of the above, applies
 *        to this plugin, unless you've my permissions not needing follow so.
 *      6. I always reserve the right to deny you from using this plugin
 *        anymore if you've violated any of the above.

Contributors
*      Authors:
 *      1. DoubleX
 *      Plugin Development Collaborators:
 *      - None So Far
 *      Bug Reporters:
 *      - None So Far
 *      Compatibility Issue Raisers:
 *      - None So Far
 *      Feature Requesters:
 *      - None So Far

Changelog
*      { codebase: "1.1.1", plugin: "v1.01a" }(2020 Dec 26 GMT 1300):
 *      1. Added the following notetag types:
 *        subjectMiss
 *        subjectEva
 *        subjectCnt
 *        subjectMrf
 *        subjectCri
 *        subjectNorm
 *        subjectSubstitute
 *      2. Added the following parameters:
 *        subjectMissNotetagDataTypePriorities
 *        subjectEvaNotetagDataTypePriorities
 *        subjectCntNotetagDataTypePriorities
 *        subjectMrfNotetagDataTypePriorities
 *        subjectCriNotetagDataTypePriorities
 *        subjectNormNotetagDataTypePriorities
 *        subjectSubstituteNotetagDataTypePriorities
 *      3. Fixed the eventEntry of all notetags not correctly accepting all
 *        intended suffixes and rejecting the unintended ones
*      { codebase: "1.1.0", plugin: "v1.00b" }(2020 Dec 2 GMT 0300):
 *      1. You no longer have to edit the value of
 *        DoubleX_RMMZ.Skill_Item_Triggers.PLUGIN_NAME when changing this
 *        plugin file name
*      { codebase: "1.0.0", plugin: "v1.00a" }(2020 Aug 30 GMT 0900):
 *      1. 1st version of this plugin finished

Download Link
Demo Link
20
DoubleX RMMZ State Triggers
Authors: DoubleX
Version: v1.00b
Type: State Add-on
Key Term: Battle Add-on

Purpose
Lets you run some codes set by your notetags on some important state timings

Introduction
 *    1. This plugin lets you use notetags to set what happens when a state's
 *      added/removed/expired/turn's updated/turn's reset on the battler
 *      involved
 *    2. You're expected to write JavaScript codes directly, as there are so
 *      much possibilities that most of them are just impossible to be
 *      covered by this plugin itself, so this plugin just lets you write
 *      JavaScript codes that are executed on some important timings

Video

Games using this plugin
None so far

Parameters
 * @param addNotetagDataTypePriorities
 * @type select[]
 * @option Data of the actor
 * @value actor
 * @option Data of the current class
 * @value class
 * @option Data of learnt skills/action list(Shouldn't be used with Data of usable skills)
 * @value skills
 * @option Data of usable skills(Shouldn't be used with Data of learnt skills)
 * @value usableSkills
 * @option Data of possessed items(Shouldn't be used with Data of usable items)
 * @value items
 * @option Data of usable items(Shouldn't be used with Data of possessed items)
 * @value usableItems
 * @option Data of the latest skill/item being used(Can double-count with skills/items/usableSkills/usableItems)
 * @value latestSkillItem
 * @option Data of equipped weapons
 * @value weapons
 * @option Data of equipped armors
 * @value armors
 * @option Data of the enemy
 * @value enemy
 * @option Data of effective states
 * @value states
 * @option Data of the state to have triggers run
 * @value thisState
 * @desc Sets data type priorities of the add notetags
 * You can use script calls/plugin commands to change this
 * @default ["thisState"]
 *
 * @param removeNotetagDataTypePriorities
 * @type select[]
 * @option Data of the actor
 * @value actor
 * @option Data of the current class
 * @value class
 * @option Data of learnt skills/action list(Shouldn't be used with Data of usable skills)
 * @value skills
 * @option Data of usable skills(Shouldn't be used with Data of learnt skills)
 * @value usableSkills
 * @option Data of possessed items(Shouldn't be used with Data of usable items)
 * @value items
 * @option Data of usable items(Shouldn't be used with Data of possessed items)
 * @value usableItems
 * @option Data of the latest skill/item being used(Can double-count with skills/items/usableSkills/usableItems)
 * @value latestSkillItem
 * @option Data of equipped weapons
 * @value weapons
 * @option Data of equipped armors
 * @value armors
 * @option Data of the enemy
 * @value enemy
 * @option Data of effective states
 * @value states
 * @option Data of the state to have triggers run
 * @value thisState
 * @desc Sets data type priorities of the remove notetags
 * You can use script calls/plugin commands to change this
 * @default ["thisState"]
 *
 * @param resetNotetagDataTypePriorities
 * @type select[]
 * @option Data of the actor
 * @value actor
 * @option Data of the current class
 * @value class
 * @option Data of learnt skills/action list(Shouldn't be used with Data of usable skills)
 * @value skills
 * @option Data of usable skills(Shouldn't be used with Data of learnt skills)
 * @value usableSkills
 * @option Data of possessed items(Shouldn't be used with Data of usable items)
 * @value items
 * @option Data of usable items(Shouldn't be used with Data of possessed items)
 * @value usableItems
 * @option Data of the latest skill/item being used(Can double-count with skills/items/usableSkills/usableItems)
 * @value latestSkillItem
 * @option Data of equipped weapons
 * @value weapons
 * @option Data of equipped armors
 * @value armors
 * @option Data of the enemy
 * @value enemy
 * @option Data of effective states
 * @value states
 * @option Data of the state to have triggers run
 * @value thisState
 * @desc Sets data type priorities of the reset notetags
 * You can use script calls/plugin commands to change this
 * @default ["thisState"]
 *
 * @param expireNotetagDataTypePriorities
 * @type select[]
 * @option Data of the actor
 * @value actor
 * @option Data of the current class
 * @value class
 * @option Data of learnt skills/action list(Shouldn't be used with Data of usable skills)
 * @value skills
 * @option Data of usable skills(Shouldn't be used with Data of learnt skills)
 * @value usableSkills
 * @option Data of possessed items(Shouldn't be used with Data of usable items)
 * @value items
 * @option Data of usable items(Shouldn't be used with Data of possessed items)
 * @value usableItems
 * @option Data of the latest skill/item being used(Can double-count with skills/items/usableSkills/usableItems)
 * @value latestSkillItem
 * @option Data of equipped weapons
 * @value weapons
 * @option Data of equipped armors
 * @value armors
 * @option Data of the enemy
 * @value enemy
 * @option Data of effective states
 * @value states
 * @option Data of the state to have triggers run
 * @value thisState
 * @desc Sets data type priorities of the expire notetags
 * You can use script calls/plugin commands to change this
 * @default ["thisState"]
 *
 * @param turnNotetagDataTypePriorities
 * @type select[]
 * @option Data of the actor
 * @value actor
 * @option Data of the current class
 * @value class
 * @option Data of learnt skills/action list(Shouldn't be used with Data of usable skills)
 * @value skills
 * @option Data of usable skills(Shouldn't be used with Data of learnt skills)
 * @value usableSkills
 * @option Data of possessed items(Shouldn't be used with Data of usable items)
 * @value items
 * @option Data of usable items(Shouldn't be used with Data of possessed items)
 * @value usableItems
 * @option Data of the latest skill/item being used(Can double-count with skills/items/usableSkills/usableItems)
 * @value latestSkillItem
 * @option Data of equipped weapons
 * @value weapons
 * @option Data of equipped armors
 * @value armors
 * @option Data of the enemy
 * @value enemy
 * @option Data of effective states
 * @value states
 * @option Data of the state to have triggers run
 * @value thisState
 * @desc Sets data type priorities of the turn notetags
 * You can use script calls/plugin commands to change this
 * @default ["thisState"]

Notetags
 *    ## Notetag Info
 *      1. Among all the same notetag types in the same data, all can be
 *          effective
 *      2. Each line can only have at most 1 notetag
 *      3. The following is the structure of all notetags in this plugin:
 *          - <doublex rmmz state triggers contents>
 *          - <state triggers contents>
 *          Where contents are in the form of type suffixes: entries
 *          Either of the above can be used, but the 1st one reduce the chance
 *          of causing other plugins to treat the notetags of this plugin as
 *          theirs, while the 2nd one is more user-friendly
 *          - type is one of the following:
 *            1. add
 *            2. remove
 *            3. reset
 *            4. expire
 *            5. turn
 *          - suffixes is the list of suffixes in the form of:
 *            suffix1 suffix2 suffix3 ... suffixn
 *            Where each suffix is either of the following:
 *            val(The notetag value will be used as-is)
 *            switch(The value of the game switch with id as the notetag value
 *                  will be used)
 *            event(The common event with id as the notetag value will be
 *                  reserved)
 *            (Advanced)script(The value of the game variable with id as the
 *                            notetag value will be used as the contents of
 *                            the functions to be called upon using the
 *                            notetag)
 *          - The this pointer of the script suffix is the action involved
 *            (Game_Battler.prototype)
 *          - entries is the list of entries in the form of:
 *            entry1, entry2, entry3, ..., entryn
 *            Where entryi must conform with the suffixi specifications
 *----------------------------------------------------------------------------
 *    # Actor/Class/Learnt Skills/Usable Skills/Posessed Items/Usable Items/
 *      Inputted Skill Or Item/Weapon/Armor/Enemy/States/This State Notetags
 *      1. add condSuffix eventSuffix: condEntry, eventEntry
 *        - Triggers what specified in eventEntry when the state's just added
 *          to the battler involved(not when the state already exists before)
 *          if condEntry returns a truthy result
 *        - condSuffix can be val, switch or script
 *        - eventEntry can be event or script
 *        - The result of condEntry can be anything as only whether it's
 *          truthy matters
 *        - If the result of condEntry is falsy, this notetag will be
 *          discarded upon such use cases
 *        - The result of eventEntry can be anything as it's supposed to run
 *          commands instead of returning results
 *        - E.g.:
 *          <state triggers add switch event: 1, 2> will reserve the common
 *          event with id 2 when the state's just added to the battler
 *          involved(not when it already exists before) if the game switch
 *          with id 1 is on
 *      2. remove condSuffix eventSuffix: condEntry, eventEntry
 *        - Triggers what specified in eventEntry when the state's just
 *          removed from the battler involved(not when the state turn just
 *          expired causing the removal) if condEntry returns a truthy result
 *        - condSuffix can be val, switch or script
 *        - eventEntry can be event or script
 *        - The result of condEntry can be anything as only whether it's
 *          truthy matters
 *        - If the result of condEntry is falsy, this notetag will be
 *          discarded upon such use cases
 *        - The result of eventEntry can be anything as it's supposed to run
 *          commands instead of returning results
 *        - E.g.:
 *          <state triggers remove val script: true, 3> will always run the
 *          JavaScript codes stored as a string in variable with id 3 when
 *          the state's just removed from the battler involved(not when the
 *          state turn just expired causing the removal)
 *      3. reset condSuffix eventSuffix: condEntry, eventEntry
 *        - Triggers what specified in eventEntry when the state's turn's
 *          just reset due to trying to add that state to the battler
 *          involved if condEntry returns a truthy result
 *        - condSuffix can be val, switch or script
 *        - eventEntry can be event or script
 *        - The result of condEntry can be anything as only whether it's
 *          truthy matters
 *        - If the result of condEntry is falsy, this notetag will be
 *          discarded upon such use cases
 *        - The result of eventEntry can be anything as it's supposed to run
 *          commands instead of returning results
 *        - E.g.:
 *          <state triggers reset switch event: 1, 2> will reserve the common
 *          event with id 2 when the state's turn's just reset due to trying
 *          to add that state to the battler involved if the game switch with
 *          id 1 is on
 *      4. expire condSuffix eventSuffix: condEntry, eventEntry
 *        - Triggers what specified in eventEntry when the state's turn's
 *          just expired causing the state to be removed from the battler
 *          involved if condEntry returns a truthy result
 *        - condSuffix can be val, switch or script
 *        - eventEntry can be event or script
 *        - The result of condEntry can be anything as only whether it's
 *          truthy matters
 *        - If the result of condEntry is falsy, this notetag will be
 *          discarded upon such use cases
 *        - The result of eventEntry can be anything as it's supposed to run
 *          commands instead of returning results
 *        - E.g.:
 *          <state triggers expire val script: true, 3> will always run the
 *          JavaScript codes stored as a string in variable with id 3 when
 *          the state's turn's just expired causing the state to be removed
 *          from the battler involved
 *      5. turn condSuffix eventSuffix: condEntry, eventEntry
 *        - Triggers what specified in eventEntry when the state's turn's
 *          just updated without being expired for the battler involved if
 *          condEntry returns a truthy result
 *        - condSuffix can be val, switch or script
 *        - eventEntry can be event or script
 *        - The result of condEntry can be anything as only whether it's
 *          truthy matters
 *        - If the result of condEntry is falsy, this notetag will be
 *          discarded upon such use cases
 *        - The result of eventEntry can be anything as it's supposed to run
 *          commands instead of returning results
 *        - E.g.:
 *          <state triggers turn val event: true, 2> will always reserve the
 *          common event with id 2 when the state's turn's just updated
 *          without being expired for the battler involved

Script Calls
*    # Parameter manipulations
 *      1. $gameSystem.setStateTriggersParam(param, val)
 *        - Sets the fully parsed value of the parameter param as val
 *        - param must be the name of a valid parameter of this plugin
 *        - val must be a valid new fully parsed value of the parameter param
 *        - Such parameter value changes will be saved
 *        - E.g.:
 *          $gameSystem.setStateTriggersParam("addNotetagDataTypePriorities", [
 *              "thisState"
 *          ]) sets the fully parsed value of the parameter
 *          addNotetagDataTypePriorities as ["thisState"]
 *      2. $gameSystem.stateTriggersParam(param)
 *        - Returns the fully parsed value of the parameter param
 *        - param must be the name of a valid parameter of this plugin
 *        - E.g.:
 *          $gameSystem.setStateTriggersParam("removeNotetagDataTypePriorities")
 *          returns the fully parsed value of the parameter
 *          removeNotetagDataTypePriorities, which should be
 *          ["thisState"] if it uses its default parameter value

Plugin Commands
 * @command setStateTriggersParam
 * @desc Applies script call $gameSystem.setStateTriggersParam(param, val)
 * @arg param
 * @desc The name of a valid parameter of this plugin
 * @arg val
 * @desc A valid new fully parsed value of the parameter param

Prerequisites
Plugins:
1. DoubleX RMMZ Enhanced Codebase
Abilities:
1. Some RMMV plugin development proficiency
(Basic knowledge on what RMMV plugin development does in general with several easy, simple and small plugins written without nontrivial bugs up to 1000 LoC scale but still being inexperienced)

Terms Of Use
*      1. Commercial use's always allowed and crediting me's always optional.
 *      2. You shall keep this plugin's Plugin Info part's contents intact.
 *      3. You shalln't claim that this plugin's written by anyone other than
 *        DoubleX or my aliases. I always reserve the right to deny you from
 *        using any of my plugins anymore if you've violated this.
 *      4. If you repost this plugin directly(rather than just linking back),
 *        you shall inform me of these direct repostings. I always reserve
 *        the right to request you to edit those direct repostings.
 *      5. CC BY 4.0, except those conflicting with any of the above, applies
 *        to this plugin, unless you've my permissions not needing follow so.
 *      6. I always reserve the right to deny you from using this plugin
 *        anymore if you've violated any of the above.

Contributors
*      Authors:
 *      1. DoubleX
 *      Plugin Development Collaborators:
 *      - None So Far
 *      Bug Reporters:
 *      - None So Far
 *      Compatibility Issue Raisers:
 *      - None So Far
 *      Feature Requesters:
 *      - None So Far

Changelog
*      { codebase: "1.1.0", plugin: "v1.00b" }(2020 Dec 2 GMT 0400):
 *      1. You no longer have to edit the value of
 *        DoubleX_RMMZ.State_Triggers.PLUGIN_NAME when changing this plugin
 *        file name
*      { codebase: "1.0.0", plugin: "v1.00a" }(2020 Aug 29 GMT 1300):
 *      1. 1st version of this plugin finished

Download Link
Demo Link
21
RMMZ Script Database / [MZ] DoubleX RMMZ Dynamic Data
August 28, 2020, 05:35:35 am
DoubleX RMMZ Dynamic Data
Authors: DoubleX
Version: v1.00a
Type: Database Add-on
Key Term: Misc Add-on

Purpose
Lets you edit some database data on the fly and such edits will be saved

Introduction
1. This plugins lets you change some database data on the fly, and those changes will be saved in save files
2. Changing too many database data in the same save can lead to the save file being too big, so only make absolutely necessary changes
3. This plugin doesn't work with dynamic map data, and I've no plans to support this, as it's all too complicated and convoluted to make it work well without creating even greater troubles, like the game file being too big and map reload issues
4. CHANGING DATA ON THE FLY SHOULD NEVER BE TAKEN LIGHTLY, SO THIS PLUGIN'S SPECIFICALLY DESIGNED TO NOT HAVE RMMZ BEGINNERS IN MIND

Video

Games using this plugin
None so far

Script Calls
 *    # Databse data manipulations
 *      1. $gameSystem.setDynamicData(containerName, data)
 *        - Applies the edit of data stored by container with name
 *          containerName, and the edited data will be saved in save
 *          files so those edits will be preserved
 *        - data must be a valid database data which must be serializable
 *          (It means that this plugin doesn't support foreign plugins adding
 *            undisclosed unserializable properties to database data)
 *        - containerName must be either of the following:
 *          "$dataActors"
 *          "$dataClasses"
 *          "$dataSkills"
 *          "$dataItems"
 *          "$dataWeapons"
 *          "$dataArmors"
 *          "$dataEnemies"
 *          "$dataTroops"
 *          "$dataStates"
 *          "$dataAnimations"
 *          "$dataTilesets"
 *          "$dataCommonEvents"
 *          "$dataSystem"
 *          "$dataMapInfos"
 *        - E.g.:
 *          $gameSystem.setDynamicData("$dataSkills", $dataSkills[3]) applies
 *          the edit of skill with id 3 stored by $dataSkills and that edited
 *          skill will be saved in save files so those edits will be
 *          preserved

Prerequisites
Plugins:
1. DoubleX RMMZ Enhanced Codebase
Abilities:
2. Little RMMZ plugin development proficiency
  (Elementary Javascript exposures being able to write beginner codes up to 300LoC scale)

Terms Of Use
 *      1. Commercial use's always allowed and crediting me's always optional.
 *      2. You shall keep this plugin's Plugin Info part's contents intact.
 *      3. You shalln't claim that this plugin's written by anyone other than
 *        DoubleX or my aliases. I always reserve the right to deny you from
 *        using any of my plugins anymore if you've violated this.
 *      4. If you repost this plugin directly(rather than just linking back),
 *        you shall inform me of these direct repostings. I always reserve
 *        the right to request you to edit those direct repostings.
 *      5. CC BY 4.0, except those conflicting with any of the above, applies
 *        to this plugin, unless you've my permissions not needing follow so.
 *      6. I always reserve the right to deny you from using this plugin
 *        anymore if you've violated any of the above.

Contributors
 *      Authors:
 *      1. DoubleX
 *      Plugin Development Collaborators:
 *      - None So Far
 *      Bug Reporters:
 *      - None So Far
 *      Compatibility Issue Raisers:
 *      - None So Far
 *      Feature Requesters:
 *      - None So Far

Changelog
 *      { codebase: "1.0.0", plugin: "v1.00a" }(2020 Aug 28 GMT 0700):
 *      1. 1st version of this plugin finished

Download Link
Demo Link
22
DoubleX RMMZ Skill Item Cooldown
Authors: DoubleX
Version: v1.01b
Type: Battler And Skill/Item Cooldown Add-on
Key Term: Battle Add-on

Purpose
Lets you set some skills/items to have battler and skill/item cooldowns

Introduction
 *    1. This plugins lets you set 2 kinds of skill/item cooldowns:
 *      - Skill/Item cooldown - The number of turns(battle turn in turn based
 *                              individual turn in TPBS) needed for the
 *                              skill/item to cooldown before it becomes
 *                              usable again
 *      - Battler cooldown - The number of turns(battle turn in turn based
 *                            individual turn in TPBS) needed for the battler
 *                            just executed the skill/item to cooldown before
 *                            that battler can input actions again
 *    2. If the skill/item cooldown is 1 turn, it means battlers with multiple
 *      action slots can only input that skill/item once instead of as many
 *      as the action slots allow
 *      If the battler cooldown is negative, it means the TPB bar charging
 *      value will be positive instead of 0 right after executing the
 *      skill/item(So a -1 battler cooldown means the battler will become
 *      able to input actions again right after executing such skills/items)
 *    3. When updating the battler individual turn count in TPBS, the decimal
 *      parts of the battler will be discarded, but those parts will still be
 *      used when actually increasing the time needed for that battler to
 *      become able to input actions again
 *      In the turn based battle system, the decimal parts of the battler
 *      cooldown counts as 1 turn
 *      The decimal parts of the final skill/item cooldown value will be
 *      discarded
 *    4. Skill/item cooldown can be set to apply outside battles as well
 *      Skill/item cooldown won't be updated when the battler has fully
 *      charged the TPBS bar

Video


Games using this plugin
None so far

Parameters
* @param clearBattlerSkillItemCooldownOnBattleStart
* @type note
* @desc Let you clear battler/skill/item cooldowns on battle start
* actor is the actor to have all those cooldowns cleared
* @default "actor.clearBattlerSkillItemCooldowns();"
*
* @param clearBattlerSkillItemCooldownOnBattleEnd
* @type note
* @desc Lets you clear battler/skill/item cooldowns on battle end
* actor is the actor to have all those cooldowns cleared
* @default "actor.clearBattlerSkillItemCooldowns();"
*
* @param battlerNotetagDataTypePriorities
* @type select[]
* @option Data of the actor
* @value actor
* @option Data of the current class
* @value class
* @option Data of learnt skills/action list(Shouldn't be used with Data of usable skills)
* @value skills
* @option Data of usable skills(Shouldn't be used with Data of learnt skills)
* @value usableSkills
* @option Data of possessed items(Shouldn't be used with Data of usable items)
* @value items
* @option Data of usable items(Shouldn't be used with Data of possessed items)
* @value usableItems
* @option Data of the latest skill/item being used(Can double-count with skills/items/usableSkills/usableItems)
* @value latestSkillItem
* @option Data of equipped weapons
* @value weapons
* @option Data of equipped armors
* @value armors
* @option Data of the enemy
* @value enemy
* @option Data of effective states
* @value states
* @desc Sets data type priorities of the battler notetags
* You can use script calls/plugin commands to change this
* @default ["latestSkillItem","states","enemy","armors","weapons","class","actor"]
*
* @param skillItemNotetagDataTypePriorities
* @type select[]
* @option Data of the actor
* @value actor
* @option Data of the current class
* @value class
* @option Data of learnt skills/action list(Shouldn't be used with Data of usable skills)
* @value skills
* @option Data of usable skills(Shouldn't be used with Data of learnt skills)
* @value usableSkills
* @option Data of possessed items(Shouldn't be used with Data of usable items)
* @value items
* @option Data of usable items(Shouldn't be used with Data of possessed items)
* @value usableItems
* @option Data of the latest skill/item being used(Can double-count with skills/items/usableSkills/usableItems)
* @value latestSkillItem
* @option Data of equipped weapons
* @value weapons
* @option Data of equipped armors
* @value armors
* @option Data of the enemy
* @value enemy
* @option Data of effective states
* @value states
* @desc Sets data type priorities of the skillItem notetags
* You can use script calls/plugin commands to change this
* @default ["latestSkillItem","states","enemy","armors","weapons","class","actor"]

Notetags
*    ## Notetag Info
*      1. Among all the same notetag types in the same data, all can be
*          effective
*      2. Each line can only have at most 1 notetag
*      3. The following is the structure of all notetags in this plugin:
*          - <doublex rmmz cooldown>
*          - <cooldown>
*          Where contents are in the form of type suffixes: entries
*          Either of the above can be used, but the 1st one reduce the chance
*          of causing other plugins to treat the notetags of this plugin as
*          theirs, while the 2nd one is more user-friendly
*          - type is one of the following:
*            1. battler
*            2. skillItem
*            (Search tag: NOTE_TYPE)
*          - suffixes is the list of suffixes in the form of:
*            suffix1 suffix2 suffix3 ... suffixn
*            Where each suffix is either of the following:
*            val(The notetag value will be used as-is)
*            switch(The value of the game switch with id as the notetag value
*                  will be used)
*            var(The value of the game variable with id as the notetag value
*                will be used)
*            (Advanced)script(The value of the game variable with id as the
*                            notetag value will be used as the contents of
*                            the functions to be called upon using the
*                            notetag)
*          - The this pointer of the script suffix is the battler involved
*            (Game_Battler.prototype)
*          - entries is the list of entries in the form of:
*            entry1, entry2, entry3, ..., entryn
*            Where entryi must conform with the suffixi specifications
*----------------------------------------------------------------------------
*    # Actor/Class/Learnt Skills/Usable Skills/Posessed Items/Usable Items/
*      Inputted Skill Or Item/Weapon/Armor/Enemy/States Notetags
*      Notetags only apply to skills/items with Number as One in Scope
*      1. battler condSuffix opSuffix valSuffix: condEntry, opEntry, valEntry
*        - Applies the following formula on the current battler cooldown:
*          current = current operator value
*          If condEntry returns a turthy result
*          Where current is the current battler cooldown, operator is the
*          operator specified by opEntry, and value is the value specified
*          by valEntry
*        - If there are no notetags, current will be 0, as it's the default
*          battler cooldown value
*        - condSuffix can be val, switch or script
*        - Both opSuffix and valSuffix can be val, var or script
*        - The result of condEntry can be anything as only whether it's
*          truthy matters
*        - The result of opSuffix must be either of the following:
*          +
*          -
*          *
*          /
*          %
*          =
*        - The result of valEntry can be any number
*        - E.g.:
*          <cooldown battler script val val: 1, +, 1> will cause the
*          battler to wait for 1 turn before the TPB bar starts to charge
*          again, and the individual turn count will be added by 1 after
*          this wait, in the case of TPBS, and the battler won't be able to
*          input actions in the next turn for turn based battles, but the
*          battler cooldown won't be triggered by using skills/items outside
*          battles, because the value of variable with id 1 is
*          return $gameParty.inBattle(); meaning that this notetag will only
*          be effective inside battles
*          Cooldowns triggered inside battles can still carry over outside
*          battles if the battle ends but the cooldown's still not expired
*          if it's not cleared in clearBattlerSkillItemCooldownOnBattleEnd,
*          and vice verse if it's not cleared in
*          clearBattlerSkillItemCooldownOnBattleStart
*      2. skillItem condSuffix opSuffix valSuffix: condEntry, opEntry, valEntry
*        - Applies the following formula on the current skill/item cooldown:
*          current = current operator value
*          If condEntry returns a turthy result
*          Where current is the current skill/item cooldown, operator is the
*          operator specified by opEntry, and value is the value specified
*          by valEntry
*        - If there are no notetags, current will be 0, as it's the default
*          skill/item cooldown value
*        - condSuffix can be val, switch or script
*        - Both opSuffix and valSuffix can be val, var or script
*        - The result of condEntry can be anything as only whether it's
*          truthy matters
*        - The result of opSuffix must be either of the following:
*          +
*          -
*          *
*          /
*          %
*          =
*        - The result of valEntry can be any number
*        - THIS NOTETAG DOESN'T WORK WITH ATTACK, GUARD NOR FORCED ACTIONS
*        - E.g.:
*          <cooldown skillItem switch val val: 1, +, 2> will cause the
*          battler to be unable to input the skill/item in the next turn if
*          the game switch with id 1 is on(regrdless of whether it's inside
*          or outside battles)
*          Cooldowns triggered outside battles can still carry over inside
*          battles if the battle ends but the cooldown's still not expired
*          if it's not cleared in
*          clearBattlerSkillItemCooldownOnBattleStart, and vice verse if
*          it's not cleared in clearBattlerSkillItemCooldownOnBattleEnd

Script Calls
 *    # Parameter manipulations
 *      1. $gameSystem.setSkillItemCooldownParam(param, val)
 *        - Sets the fully parsed value of the parameter param as val
 *        - param must be the name of a valid parameter of this plugin
 *        - val must be a valid new fully parsed value of the parameter param
 *        - Such parameter value changes will be saved
 *        - E.g.:
 *          $gameSystem.setSkillItemCooldownParam("battlerNotetagDataTypePriorities", [
 *              "latestSkillItem",
 *              "states",
 *              "armors",
 *              "weapons",
 *              "class",
 *              "actor",
 *              "enemy"
 *          ]) sets the fully parsed value of the parameter
 *          battlerNotetagDataTypePriorities as
 *          ["latestSkillItem","states", "armors", "weapons", "class", "actor", "enemy"]
 *      2. $gameSystem.skillItemCooldownParam(param)
 *        - Returns the fully parsed value of the parameter param
 *        - param must be the name of a valid parameter of this plugin
 *        - E.g.:
 *          $gameSystem.skillItemCooldownParam("skillItemNotetagDataTypePriorities")
 *          returns the fully parsed value of the parameter
 *          skillItemNotetagDataTypePriorities, which should be
 *          ["latestSkillItem","states", "armors", "weapons", "class", "actor", "enemy"]
 *          if it uses its default parameter value
 *    # Battler manipulations
 *      1. clearBattlerSkillItemCooldowns()
 *        - Clears all battler and skill/item cooldowns for the battler
 *          involved
 *        - E.g.:
 *          $gameActors.actor(1).clearBattlerSkillItemCooldowns(1) will clear
 *          all battler and skill/item cooldowns for the game actor with id 1
 *      2. setBattlerCooldown(turnCount)
 *        - Sets the battler cooldown turn count as turnCount for the battler
 *          involved
 *        - turnCount must be a number
 *        - E.g.:
 *          $gameActors.actor(1).setBattlerCooldown(1) will set the battler
 *          cooldown turn count of the actor with id 1 as 1, meaning that the
 *          battler will take 1 idle individual turn right after executing
 *          all actions but before charging the TPB bar again(in the case of
 *          TPBS) and in the case of the turn based battle system, that
 *          battler won't be able to input actions in the next turn
 *      3. battlerCooldown()
 *        - Returns the battler cooldown turn count of the battler involed
 *        - E.g.:
 *          $gameParty.battleMembers(0).battlerCooldown() will return the
 *          battler cooldown turn count of the 1st game party member in the
 *          battle
 *      4. isBattlerCooldown()
 *        - Returns if the battler involved is having battler cooldown
 *        - E.g.:
 *          $gameParty.aliveMembers(1).isBattlerCooldown() will return if the
 *          2nd alive game party member is having battler cooldown
 *      5. setSkillItemCooldown(item, turnCount)
 *        - Sets the skill/item cooldown turn count of item as turnCount for
 *          the battler involved
 *        - item must be the data of the skill/item to have its cooldown set
 *        - turnCount must be a number
 *        - E.g.:
 *          $gameParty.movableMembers(2).setSkillItemCooldown($dataSkills[3], 2)
 *          will set the skill/item cooldown turn count of the skill with id
 *          3 for the 3rd movable game party member as 2, meaning that that
 *          battler can't input that skill for the next 2 turns
 *      6. skillItemCooldown(item)
 *        - Returns the skill/item cooldown with item of the battler involved
 *        - E.g.:
 *          $gameTroop.members(0).skillItemCooldown($dataItems[1]) will
 *          return the skill/item cooldown with item with id 1 of the 1st
 *          game troop member
 *      7. isSkillItemCooldown(item)
 *        - Returns if the battler involved is having skill/item cooldown
 *          with item
 *        - E.g.:
 *          $gameParty.deadMembers(1).isSkillItemCooldown($dataItems[2]) will
 *          return if the 2nd dead game troop member is having skill/item
 *          cooldown with item with id 2

Plugin Commands
* @command setSkillItemCooldownParam
* @desc Applies script call $gameSystem.setSkillItemCooldownParam(param, val)
* @arg param
* @desc The name of a valid parameter of this plugin
* @arg val
* @desc A valid new fully parsed value of the parameter param
*
* @command clearBattlerSkillItemCooldowns
* @desc Applies script call battler.clearBattlerSkillItemCooldowns()
* @arg side
* @type select
* @option Actor
* @value actor
* @option Enemy
* @value enemy
* @desc The side of the battler setting the battler cooldown
* @arg label
* @type number
* @desc The actor id/enemy index of the battler setting the battler cooldown
*
* @command setBattlerCooldown
* @desc Applies script call battler.setBattlerCooldown(turnCount)
* @arg side
* @type select
* @option Actor
* @value actor
* @option Enemy
* @value enemy
* @desc The side of the battler setting the battler cooldown
* @arg label
* @type number
* @desc The actor id/enemy index of the battler setting the battler cooldown
* @arg turnCount
* @type number
* @min -999999
* @desc The new battler cooldown turn count of the battler involved
*
* @command setSkillItemCooldown
* @desc Applies script call battler.setSkillItemCooldown(item, turnCount)
* @arg side
* @type select
* @option Actor
* @value actor
* @option Enemy
* @value enemy
* @desc The side of the battler setting the skill/item cooldown
* with the skill/item involved
* @arg label
* @type number
* @desc The actor id/enemy index of the battler setting the
* skill/item cooldown with the skill/item involved
* @arg type
* @type select
* @option Skill
* @value skill
* @option Item
* @value item
* @desc The skill/item to have its skill/item cooldown set for the
* battler involved
* @arg id
* @type number
* @desc The id of the skill/item to have its skill/item cooldown
* set for the battler involved
* @arg turnCount
* @type number
* @min -999999
* @desc The new skill/item cooldown turn count of the skill/item involved
* @command battlerCooldown
 * @desc Stores the battler.battlerCooldown() script call results
 * into the game variable with id varId
 * @arg side
 * @type select
 * @option Actor
 * @value actor
 * @option Enemy
 * @value enemy
 * @desc The side of the battler setting the battler cooldown
 * @arg label
 * @type number
 * @desc The actor id/enemy index of the battler setting the battler cooldown
 * @arg varId
 * @type number
 * @desc The id of the game variable storing the script call result
 *
 * @command isBattlerCooldown
 * @desc Stores the battler.isBattlerCooldown() script call results
 * into the game switch with id switchId
 * @arg side
 * @type select
 * @option Actor
 * @value actor
 * @option Enemy
 * @value enemy
 * @desc The side of the battler setting the battler cooldown
 * @arg label
 * @type number
 * @desc The actor id/enemy index of the battler setting the battler cooldown
 * @arg switchId
 * @type number
 * @desc The id of the game switch storing the script call result
 * * @command skillItemCooldown * @desc Stores the battler.skillItemCooldown(item) script call * results into the game variable with id varId * @arg side * @type select * @option Actor * @value actor * @option Enemy * @value enemy * @desc The side of the battler setting the skill/item cooldown * with the skill/item involved * @arg label * @type number * @desc The actor id/enemy index of the battler setting the * skill/item cooldown with the skill/item involved * @arg type * @type select * @option Skill * @value skill * @option Item * @value item * @desc The skill/item to have its skill/item cooldown set for the * battler involved * @arg id * @type number * @desc The id of the skill/item to have its skill/item cooldown * set for the battler involved * @arg varId * @type number * @desc The id of the game variable storing the script call result * * @command isSkillItemCooldown * @desc Stores the battler.isSkillItemCooldown(item) script call * results into the game switch with id switchId * @arg side * @type select * @option Actor * @value actor * @option Enemy * @value enemy * @desc The side of the battler setting the skill/item cooldown * with the skill/item involved * @arg label * @type number * @desc The actor id/enemy index of the battler setting the * skill/item cooldown with the skill/item involved * @arg type * @type select * @option Skill * @value skill * @option Item * @value item * @desc The skill/item to have its skill/item cooldown set for the * battler involved * @arg id * @type number * @desc The id of the skill/item to have its skill/item cooldown * set for the battler involved * @arg switchId * @type number * @desc The id of the game switch storing the script call result

"Plugin Query Info": ShowHide

1. You need to use DoubleX_RMMZ_Plugin_Query as well in order to use the plugin queries of this plugin
*      1. battlerCooldown side label
 *        - Applies the script call battler.battlerCooldown()
 *        - battler is the battler identified by side and label
 *        - side is either actor or enemy
 *        - label is the actor id for side actor and troop member index for
 *          side enemy
 *      2. isBattlerCooldown side label
 *        - Applies the script call battler.isBattlerCooldown()
 *        - battler is the battler identified by side and label
 *        - side is either actor or enemy
 *        - label is the actor id for side actor and troop member index for
 *          side enemy
 *      3. skillItemCooldown side label type id
 *        - Applies the script call battler.skillItemCooldown(item)
 *        - battler is the battler identified by side and label
 *        - side is either actor or enemy
 *        - label is the actor id for side actor and troop member index for
 *          side enemy
 *        - item is the skill/item identified by type and id
 *        - type is either skill or item
 *        - id is the id of the skill/item
 *      4. isSkillItemCooldown side label type id
 *        - Applies the script call battler.isSkillItemCooldown(item)
 *        - battler is the battler identified by side and label
 *        - side is either actor or enemy
 *        - label is the actor id for side actor and troop member index for
 *          side enemy
 *        - item is the skill/item identified by type and id
 *        - type is either skill or item
 *        - id is the id of the skill/item


Prerequisites
Plugins:
1. DoubleX RMMZ Enhanced Codebase
Abilities:
1. Nothing special for most ordinary cases
2. Little RMMZ plugin development proficiency to fully utilize this(Elementary Javascript exposures being able to write beginner codes up to 300LoC scale)

Terms Of Use
 *      1. Commercial use's always allowed and crediting me's always optional.
 *      2. You shall keep this plugin's Plugin Info part's contents intact.
 *      3. You shalln't claim that this plugin's written by anyone other than
 *        DoubleX or my aliases. I always reserve the right to deny you from
 *        using any of my plugins anymore if you've violated this.
 *      4. If you repost this plugin directly(rather than just linking back),
 *        you shall inform me of these direct repostings. I always reserve
 *        the right to request you to edit those direct repostings.
 *      5. CC BY 4.0, except those conflicting with any of the above, applies
 *        to this plugin, unless you've my permissions not needing follow so.
 *      6. I always reserve the right to deny you from using this plugin
 *        anymore if you've violated any of the above.

Contributors
*      Authors:
 *      1. DoubleX
 *      Plugin Development Collaborators:
 *      - None So Far
 *      Bug Reporters:
 *      - None So Far
 *      Compatibility Issue Raisers:
 *      - None So Far
 *      Feature Requesters:
 *      - None So Far

Changelog
*      { codebase: "1.1.0", plugin: "v1.01b" }(2020 Nov 27 GMT 0500):
 *      1. You no longer have to edit the value of
 *        DoubleX_RMMZ.Skill_Item_Cooldown.PLUGIN_NAME when changing this
 *        plugin file name
*      { codebase: "1.0.2", plugin: "v1.01a" }(2020 Oct 11 GMT 0900):
 *      1. Added the plugin query and command counterparts for the following
 *        script calls of this plugin:
 *        - battlerCooldown()
 *        - isBattlerCooldown()
 *        - skillItemCooldown(item)
 *        - isSkillItemCooldown(item)
*      { codebase: "1.0.0", plugin: "v1.00a" }(2020 Aug 27 GMT 0300):
 *      1. 1st version of this plugin finished

Download Link
Demo Link
23
Disclaimer: This post doesn't mean that I support the idea of releasing plugins with obfuscated implementation codes, and in fact I'm personally against it in most cases(but my feeling on this isn't the point of this post at all), it's just that there might be some really extreme and rare cases making this approach at least a considerable backup plan for some plugin developers(but making this move should still never be taken lightly).

I've obfuscated 1 of my RMMV plugins(an advanced complex battle system plugin with way more than 3K LoC of implementation codes), which isn't published yet and is an older version, and I've posted it in my github repository: RMMV Plugin Obfuscation Test
Please feel free to deobfuscate this plugin(and please submit a pull request with your fully deobfuscated version), as it's a very, very old and outdated version anyway, and the current version I'm working on already has much, much more contents than that highly deprecated version(and it's still far from being complete).
I've tried to deobfuscate this obfuscated version using several online deobfuscators, but none of them can fully deobfuscate it, even though they do help quite a bit, so I don' think deobfuscating the whole thing all at once will be an easy, simple and small task(unless you're a deobsucation experts of course).

The supposed workflow of revealing parts of codes is as follows:
1. Users asks plugin developers to make some tunes and tweaks on the plugins but failed to do so(goes to 2)
2. If such tunes and tweaks can be done by editing parameters/configurations/notetags/script calls/plugin commands, then teach those users to do so, otherwise go to 3
3. If these tunes and tweaks are(after considering all factors) worthwhile to be supported by the plugins directly, then upgrade the plugins to support them(or at least announce such plans), otherwise go to 4
4. If these tunes and tweaks can be independent from the plugins, then teach those users to make those workarounds, otherwise go to 5
5. Gives the minimum amount of relevant codes(minified then deminified) to the users, and ensures those codes won't work without the rest of the plugins
Then scammers trying to steal the whole thing will have to ask for tunes and tweaks for tons of different plugin parts very quickly, and this will make their true nature very obvious, especially when it's clear that they aren't even taking time to actually implement their tunes and tweaks with the help of those revealed codes(plugin developers can also setup a policy to restrict the same user to ask, say, only 1 small group of revealed code parts per day per plugin or even per week per plugin).

I've also added 3 examples on some users requesting some parts of the plugins to be tuned and tweaked, even though I know that real plugins really using this approach will have way more than 3 groups of revealed code parts:
Add Delay Between Becoming Able To Act And Actually Inputting Actions
Change ATB Bar Window Opacity And Padding
Set The Actor And Enemy Starting ATB Values
I've tried to use them to help further deobfuscating what's already deobfuscated by online deobfuscators, but I can't even recognize which parts of the still highly deobfuscated implementation codes correspond to the revealed original versions(being minified then deminified before being revealed), so again, I feel that deobfuscating the whole thing will still be complicated and convoluted, even with the help of these revealed codes(please exclude the deobfuscation experts here).

Please STRICTLY FOCUS ON THESE 2 ASPECTS:
1. Does this approach let users effectively and efficiently tune and tweak the parts of the plugins they wanted, and what obstacles will they face if the reality isn't as ideal as it should be(possibly other than the cheap one time payment/periodic subscription needed to have such accesses)?
2. Will this approach help a scammer deobfuscate the whole plugin implementation codes, or at least enough parts of them to make a standalone plugin that can make profits way more than what those scammers costed(I'm specifically excluding the case of a highly coordinated team of scammers with many teammates)?
But not anything involving the pros and cons/rights and wrongs of obfuscating plugin implementation codes, because I've made this example as a little experiment to test whether this idea can indeed let users tune and tweak the parts of the plugins they want while still stopping scammers from stealing plugins, and I don't want this post to be severely derailed or even closed :)
24
RMMZ Script Database / [MZ] DoubleX RMMZ Targeting AI
August 25, 2020, 02:32:22 am
DoubleX RMMZ Targeting AI
Authors: DoubleX
Version: v1.01b
Type: Action target filtering Add-on
Key Term: Battle Add-on

Purpose
Lets you control some skills/items target selection AI behaviors by notetags

Introduction
1. The default RMMZ only lets you control the targeting AI by tgr, which is probabilistic rather than deterministic
2. This plugin lets you use some notetags on actors, classes, learnt skills/skills in action list, usable skills, posessed items, usable items, weapons, armors, enemies and states, to control the targeting AI by specifying some deterministic target filters
3. Targets passing the filters will still be affected by the probabilitic tgr when there are more than 1 such targets
4. This plugin only works for skills/items having 1 target, and it doesn't work well 1 random target either
5. If a filter causes no target to pass, that filter will be discarded upon such use cases

Video

Games using this plugin
None so far

Parameters
* @param notetagDataTypePriorities
 * @type select[]
 * @option Data of the actor
 * @value actor
 * @option Data of the current class
 * @value class
 * @option Data of learnt skills/action list(Shouldn't be used with Data of usable skills)
 * @value skills
 * @option Data of usable skills(Shouldn't be used with Data of learnt skills)
 * @value usableSkills
 * @option Data of possessed items(Shouldn't be used with Data of usable items)
 * @value items
 * @option Data of usable items(Shouldn't be used with Data of possessed items)
 * @value usableItems
 * @option Data of the latest skill/item being used(Can double-count with skills/items/usableSkills/usableItems)
 * @value latestSkillItem
 * @option Data of equipped weapons
 * @value weapons
 * @option Data of equipped armors
 * @value armors
 * @option Data of the enemy
 * @value enemy
 * @option Data of effective states
 * @value states
 * @desc Sets data type priorities of all notetags in this plugin
 * You can use script calls/plugin commands to change this
 * @default ["latestSkillItem","states","enemy","armors","weapons","class","actor"]


Notetags
*    ## Notetag Info
 *      1. Among all the same notetag types in the same data, all can be
 *          effective
 *      2. Each line can only have at most 1 notetag
 *      3. The following is the structure of all notetags in this plugin:
 *          - <doublex rmmz targeting ai contents>
 *          - <targeting ai contents>
 *          Where contents are in the form of type suffixes: entries
 *          Either of the above can be used, but the 1st one reduce the chance
 *          of causing other plugins to treat the notetags of this plugin as
 *          theirs, while the 2nd one is more user-friendly
 *          - type is one of the following:
 *            1. memWithAnyState
 *            2. memWithAllStates
 *            3. memWithoutAnyState
 *            4. memWithoutAllStates
 *            5. memWithAnyBuff
 *            6. memWithAllBuffs
 *            7. memWithoutAnyBuff
 *            8. memWithoutAllBuffs
 *            9. memWithAnyDebuff
 *            10. memWithAllDebuffs
 *            11. memWithoutAnyDebuff
 *            12. memWithoutAllDebuffs
 *            13. memWithAnySkill
 *            14. memWithAllSkills
 *            15. memWithoutAnySkill
 *            16. memWithoutAllSkills
 *            17. anyHighestStatMem
 *            18. allHighestStatsMem
 *            19. notAnyHighestStatMem
 *            20. notAllHighestStatsMem
 *            21. anyLowestStatMem
 *            22. allLowestStatsMem
 *            23. notAnyLowestStatMem
 *            24. notAllLowestStatsMem
 *            25. anyAboveStatMem
 *            26. allAboveStatMem
 *            27. anyBelowStatMem
 *            28. allBelowStatMem
 *            (Advanced)29. or
 *            (Search tag: NOTE_TYPE)
 *          - suffixes is the list of suffixes in the form of:
 *            suffix1 suffix2 suffix3 ... suffixn
 *            Where each suffix is either of the following:
 *            val(The notetag value will be used as-is)
 *            switch(The value of the game switch with id as the notetag value
 *                  will be used)
 *            var(The value of the game variable with id as the notetag value
 *                will be used)
 *            (Advanced)script(The value of the game variable with id as the
 *                            notetag value will be used as the contents of
 *                            the functions to be called upon using the
 *                            notetag)
 *          - entries is the list of entries in the form of:
 *            entry1, entry2, entry3, ..., entryn
 *            Where entryi must conform with the suffixi specifications
 *----------------------------------------------------------------------------
 *    # Actor/Class/Learnt Skills/Usable Skills/Posessed Items/Usable Items/
 *      Inputted Skill Or Item/Weapon/Armor/Enemy/States Notetags
 *      Notetags only apply to skills/items with Number as One in Scope
 *      Notetags causing the target list to be empty will be discard upon such
 *      use cases
 *      (Search tag: ALWAYS_HAS_TARGETS)
 *      1. memWithAnyState condSuffix stateIdsSuffix: condEntry, stateIdsEntry
 *        - Applies the following DoubleX RMMZ Unit Filters script call:
 *          memWithAnyState(stateIds, mems)
 *          Where stateIds is the stateIdsEntry results and mems is the list
 *          of possible targets of the skill/item having this notetag
 *        - condSuffix can be val, switch or script
 *        - stateIdsSuffix can be val, var or script
 *        - The result of condEntry can be anything as only whether it's
 *          truthy matters
 *        - If the result of condEntry is falsy, this notetag will be
 *          discarded upon such use cases
 *        - The result of stateIdsEntry can be an Array of any natural number
 *        - If stateIdsSuffix is val, then stateIdsEntry should be written as
 *          stateId1|stateId2|stateId3|stateIdI|stateIdN
 *        - E.g.:
 *          <targeting ai memWithAnyState switch val: 1, 2|3> will restrict
 *          the list of targets to be those with state with id 2 or 3 if the
 *          game switch with id 1 is on
 *      2. memWithAllStates condSuffix stateIdsSuffix: condEntry, stateIdsEntry
 *        - Applies the following DoubleX RMMZ Unit Filters script call:
 *          memWithAllStates(stateIds, mems)
 *          Where stateIds is the stateIdsEntry results and mems is the list
 *          of possible targets of the skill/item having this notetag
 *        - condSuffix can be val, switch or script
 *        - stateIdsSuffix can be val, var or script
 *        - The result of condEntry can be anything as only whether it's
 *          truthy matters
 *        - If the result of condEntry is falsy, this notetag will be
 *          discarded upon such use cases
 *        - The result of stateIdsEntry can be an Array of any natural number
 *        - If stateIdsSuffix is val, then stateIdsEntry should be written as
 *          stateId1|stateId2|stateId3|stateIdI|stateIdN
 *        - E.g.:
 *          <targeting ai memWithAllStates switch val: 1, 2|3> will restrict
 *          the list of targets to be those with state with id 2 and 3 if the
 *          game switch with id 1 is on
 *      3. memWithoutAnyState condSuffix stateIdsSuffix: condEntry, stateIdsEntry
 *        - Applies the following DoubleX RMMZ Unit Filters script call:
 *          memWithoutAnyState(stateIds, mems)
 *          Where stateIds is the stateIdsEntry results and mems is the list
 *          of possible targets of the skill/item having this notetag
 *        - condSuffix can be val, switch or script
 *        - stateIdsSuffix can be val, var or script
 *        - The result of condEntry can be anything as only whether it's
 *          truthy matters
 *        - If the result of condEntry is falsy, this notetag will be
 *          discarded upon such use cases
 *        - The result of stateIdsEntry can be an Array of any natural number
 *        - If stateIdsSuffix is val, then stateIdsEntry should be written as
 *          stateId1|stateId2|stateId3|stateIdI|stateIdN
 *        - E.g.:
 *          <targeting ai memWithoutAnyState switch val: 1, 2|3> will
 *          restrict the list of targets to be those with state without id 2
 *          or 3 if the game switch with id 1 is on
 *      4. memWithoutAllStates condSuffix stateIdsSuffix: condEntry, stateIdsEntry
 *        - Applies the following DoubleX RMMZ Unit Filters script call:
 *          memWithoutAllStates(stateIds, mems)
 *          Where stateIds is the stateIdsEntry results and mems is the list
 *          of possible targets of the skill/item having this notetag
 *        - condSuffix can be val, switch or script
 *        - stateIdsSuffix can be val, var or script
 *        - The result of condEntry can be anything as only whether it's
 *          truthy matters
 *        - If the result of condEntry is falsy, this notetag will be
 *          discarded upon such use cases
 *        - The result of stateIdsEntry can be an Array of any natural number
 *        - If stateIdsSuffix is val, then stateIdsEntry should be written as
 *          stateId1|stateId2|stateId3|stateIdI|stateIdN
 *        - E.g.:
 *          <targeting ai memWithoutAllStates switch val: 1, 2|3> will
 *          restrict the list of targets to be those with state without id 2
 *          and 3 if the game switch with id 1 is on
 *      5. memWithAnyBuff condSuffix paramIdsSuffix: condEntry, paramIdsEntry
 *        - Applies the following DoubleX RMMZ Unit Filters script call:
 *          memWithAnyBuff(paramIds, mems)
 *          Where paramIds is the paramIdsEntry results and mems is the list
 *          of possible targets of the skill/item having this notetag
 *        - condSuffix can be val, switch or script
 *        - paramIdsSuffix can be val, var or script
 *        - The result of condEntry can be anything as only whether it's
 *          truthy matters
 *        - If the result of condEntry is falsy, this notetag will be
 *          discarded upon such use cases
 *        - The result of paramIdsEntry can be an Array of any natural number
 *        - If paramIdsSuffix is val, then paramIdsEntry should be written as
 *          paramId1|paramId2|paramId3|paramIdI|paramIdN
 *        - E.g.:
 *          <targeting ai memWithAnyBuff switch val: 1, 2|3> will restrict
 *          the list of targets to be those with atk or def buff if the game
 *          switch with id 1 is on
 *      6. memWithAllBuffs condSuffix paramIdsSuffix: condEntry, paramIdsEntry
 *        - Applies the following DoubleX RMMZ Unit Filters script call:
 *          memWithAllBuffs(paramIds, mems)
 *          Where paramIds is the paramIdsEntry results and mems is the list
 *          of possible targets of the skill/item having this notetag
 *        - condSuffix can be val, switch or script
 *        - paramIdsSuffix can be val, var or script
 *        - The result of condEntry can be anything as only whether it's
 *          truthy matters
 *        - If the result of condEntry is falsy, this notetag will be
 *          discarded upon such use cases
 *        - The result of paramIdsEntry can be an Array of any natural number
 *        - If paramIdsSuffix is val, then paramIdsEntry should be written as
 *          paramId1|paramId2|paramId3|paramIdI|paramIdN
 *        - E.g.:
 *          <targeting ai memWithAllBuffs switch val: 1, 2|3> will restrict
 *          the list of targets to be those with atk and def buff if the game
 *          switch with id 1 is on
 *      7. memWithoutAnyBuff condSuffix paramIdsSuffix: condEntry, paramIdsEntry
 *        - Applies the following DoubleX RMMZ Unit Filters script call:
 *          memWithoutAnyBuff(paramIds, mems)
 *          Where paramIds is the paramIdsEntry results and mems is the list
 *          of possible targets of the skill/item having this notetag
 *        - condSuffix can be val, switch or script
 *        - paramIdsSuffix can be val, var or script
 *        - The result of condEntry can be anything as only whether it's
 *          truthy matters
 *        - If the result of condEntry is falsy, this notetag will be
 *          discarded upon such use cases
 *        - The result of paramIdsEntry can be an Array of any natural number
 *        - If paramIdsSuffix is val, then paramIdsEntry should be written as
 *          paramId1|paramId2|paramId3|paramIdI|paramIdN
 *        - E.g.:
 *          <targeting ai memWithoutAnyBuff switch val: 1, 2|3> will
 *          the list of targets to be those without atk or def buff if the
 *          game switch with id 1 is on
 *      8. memWithoutAllBuffs condSuffix paramIdsSuffix: condEntry, paramIdsEntry
 *        - Applies the following DoubleX RMMZ Unit Filters script call:
 *          memWithoutAllBuffs(paramIds, mems)
 *          Where paramIds is the paramIdsEntry results and mems is the list
 *          of possible targets of the skill/item having this notetag
 *        - condSuffix can be val, switch or script
 *        - paramIdsSuffix can be val, var or script
 *        - The result of condEntry can be anything as only whether it's
 *          truthy matters
 *        - If the result of condEntry is falsy, this notetag will be
 *          discarded upon such use cases
 *        - The result of paramIdsEntry can be an Array of any natural number
 *        - If paramIdsSuffix is val, then paramIdsEntry should be written as
 *          paramId1|paramId2|paramId3|paramIdI|paramIdN
 *        - E.g.:
 *          <targeting ai memWithoutAllBuffs switch val: 1, 2|3> will
 *          the list of targets to be those without atk and def buff if the
 *          game switch with id 1 is on
 *      9. memWithAnyDebuff condSuffix paramIdsSuffix: condEntry, paramIdsEntry
 *        - Applies the following DoubleX RMMZ Unit Filters script call:
 *          memWithAnyDebuff(paramIds, mems)
 *          Where paramIds is the paramIdsEntry results and mems is the list
 *          of possible targets of the skill/item having this notetag
 *        - condSuffix can be val, switch or script
 *        - paramIdsSuffix can be val, var or script
 *        - The result of condEntry can be anything as only whether it's
 *          truthy matters
 *        - If the result of condEntry is falsy, this notetag will be
 *          discarded upon such use cases
 *        - The result of paramIdsEntry can be an Array of any natural number
 *        - If paramIdsSuffix is val, then paramIdsEntry should be written as
 *          paramId1|paramId2|paramId3|paramIdI|paramIdN
 *        - E.g.:
 *          <targeting ai memWithAnyDebuff switch val: 1, 2|3> will restrict
 *          the list of targets to be those with atk or def debuff if the
 *          game switch with id 1 is on
 *      10. memWithAllDebuffs condSuffix paramIdsSuffix: condEntry, paramIdsEntry
 *          - Applies the following DoubleX RMMZ Unit Filters script call:
 *            memWithAllDebuffs(paramIds, mems)
 *            Where paramIds is the paramIdsEntry results and mems is the list
 *            of possible targets of the skill/item having this notetag
 *          - condSuffix can be val, switch or script
 *          - paramIdsSuffix can be val, var or script
 *          - The result of condEntry can be anything as only whether it's
 *            truthy matters
 *          - If the result of condEntry is falsy, this notetag will be
 *            discarded upon such use cases
 *          - The result of paramIdsEntry can be an Array of any natural
 *            number
 *          - If paramIdsSuffix is val, then paramIdsEntry should be written
 *            as paramId1|paramId2|paramId3|paramIdI|paramIdN
 *          - E.g.:
 *            <targeting ai memWithAllDebuffs switch val: 1, 2|3> will
 *            restrict the list of targets to be those with atk and def debuff
 *            if the game switch with id 1 is on
 *      11. memWithoutAnyDebuff condSuffix paramIdsSuffix: condEntry, paramIdsEntry
 *          - Applies the following DoubleX RMMZ Unit Filters script call:
 *            memWithoutAnyDebuff(paramIds, mems)
 *            Where paramIds is the paramIdsEntry results and mems is the list
 *            of possible targets of the skill/item having this notetag
 *          - condSuffix can be val, switch or script
 *          - paramIdsSuffix can be val, var or script
 *          - The result of condEntry can be anything as only whether it's
 *            truthy matters
 *          - If the result of condEntry is falsy, this notetag will be
 *            discarded upon such use cases
 *          - The result of paramIdsEntry can be an Array of any natural
 *            number
 *          - If paramIdsSuffix is val, then paramIdsEntry should be written
 *            as paramId1|paramId2|paramId3|paramIdI|paramIdN
 *          - E.g.:
 *            <targeting ai memWithoutAnyDebuff switch val: 1, 2|3> will
 *            restrict the list of targets to be those without atk or def
 *            debuff if the game switch with id 1 is on
 *      12. memWithoutAllDebuffs condSuffix paramIdsSuffix: condEntry, paramIdsEntry
 *          - Applies the following DoubleX RMMZ Unit Filters script call:
 *            memWithoutAllDebuffs(paramIds, mems)
 *            Where paramIds is the paramIdsEntry results and mems is the list
 *            of possible targets of the skill/item having this notetag
 *          - condSuffix can be val, switch or script
 *          - paramIdsSuffix can be val, var or script
 *          - The result of condEntry can be anything as only whether it's
 *            truthy matters
 *          - If the result of condEntry is falsy, this notetag will be
 *            discarded upon such use cases
 *          - The result of paramIdsEntry can be an Array of any natural
 *            number
 *          - If paramIdsSuffix is val, then paramIdsEntry should be written
 *            as paramId1|paramId2|paramId3|paramIdI|paramIdN
 *          - E.g.:
 *            <targeting ai memWithoutAllDebuffs switch val: 1, 2|3> will
 *            restrict the list of targets to be those without atk and def
 *            debuff if the game switch with id 1 is on
 *      13. memWithAnySkill condSuffix skillIdsSuffix: condEntry, skillIdsEntry
 *          - Applies the following DoubleX RMMZ Unit Filters script call:
 *            memWithAnySkill(skillIds, mems)
 *            Where skillIds is the skillIdsEntry results and mems is the list
 *            of possible targets of the skill/item having this notetag
 *          - condSuffix can be val, switch or script
 *          - skillIdsSuffix can be val, var or script
 *          - The result of condEntry can be anything as only whether it's
 *            truthy matters
 *          - If the result of condEntry is falsy, this notetag will be
 *            discarded upon such use cases
 *          - The result of skillIdsEntry can be an Array of any natural
 *            number
 *          - If skillIdsSuffix is val, then skillIdsEntry should be written
 *            as skillId1|skillId2|skillId3|skillIdI|skillIdN
 *          - E.g.:
 *            <targeting ai memWithAnySkill switch val: 1, 2|3> will restrict
 *            the list of targets to be those with skill with id 2 or 3 if the
 *            game switch with id 1 is on
 *      14. memWithAllSkills condSuffix skillIdsSuffix: condEntry, skillIdsEntry
 *          - Applies the following DoubleX RMMZ Unit Filters script call:
 *            memWithAllSkills(skillIds, mems)
 *            Where skillIds is the skillIdsEntry results and mems is the list
 *            of possible targets of the skill/item having this notetag
 *          - condSuffix can be val, switch or script
 *          - skillIdsSuffix can be val, var or script
 *          - The result of condEntry can be anything as only whether it's
 *            truthy matters
 *          - If the result of condEntry is falsy, this notetag will be
 *            discarded upon such use cases
 *          - The result of skillIdsEntry can be an Array of any natural
 *            number
 *          - If skillIdsSuffix is val, then skillIdsEntry should be written
 *            as skillId1|skillId2|skillId3|skillIdI|skillIdN
 *          - E.g.:
 *            <targeting ai memWithAllSkills switch val: 1, 2|3> will
 *            restrict the list of targets to be those with skill with id 2
 *            and 3 if the game switch with id 1 is on
 *      15. memWithoutAnySkill condSuffix skillIdsSuffix: condEntry, skillIdsEntry
 *          - Applies the following DoubleX RMMZ Unit Filters script call:
 *            memWithoutAnySkill(skillIds, mems)
 *            Where skillIds is the skillIdsEntry results and mems is the list
 *            of possible targets of the skill/item having this notetag
 *          - condSuffix can be val, switch or script
 *          - skillIdsSuffix can be val, var or script
 *          - The result of condEntry can be anything as only whether it's
 *            truthy matters
 *          - If the result of condEntry is falsy, this notetag will be
 *            discarded upon such use cases
 *          - The result of skillIdsEntry can be an Array of any natural
 *            number
 *          - If skillIdsSuffix is val, then skillIdsEntry should be written
 *            as skillId1|skillId2|skillId3|skillIdI|skillIdN
 *          - E.g.:
 *            <targeting ai memWithoutAnySkill switch val: 1, 2|3> will
 *            restrict the list of targets to be those with skill without id 2
 *            or 3 if the game switch with id 1 is on
 *      16. memWithoutAllSkills condSuffix skillIdsSuffix: condEntry, skillIdsEntry
 *          - Applies the following DoubleX RMMZ Unit Filters script call:
 *            memWithoutAllSkills(skillIds, mems)
 *            Where skillIds is the skillIdsEntry results and mems is the list
 *            of possible targets of the skill/item having this notetag
 *          - condSuffix can be val, switch or script
 *          - skillIdsSuffix can be val, var or script
 *          - The result of condEntry can be anything as only whether it's
 *            truthy matters
 *          - If the result of condEntry is falsy, this notetag will be
 *            discarded upon such use cases
 *          - The result of skillIdsEntry can be an Array of any natural
 *            number
 *          - If skillIdsSuffix is val, then skillIdsEntry should be written
 *            as skillId1|skillId2|skillId3|skillIdI|skillIdN
 *          - E.g.:
 *            <targeting ai memWithoutAllSkills switch val: 1, 2|3> will
 *            restrict the list of targets to be those with skill without id 2
 *            and 3 if the game switch with id 1 is on
 *      17. anyHighestStatMem condSuffix statsSuffix: condEntry, statsEntry
 *          - Applies the following DoubleX RMMZ Unit Filters script call:
 *            anyHighestStatMem(stats, mems)
 *            Where stats is the statsEntry results and mems is the list of
 *            possible targets of the skill/item having this notetag
 *          - condSuffix can be val, switch or script
 *          - statsSuffix can be val, var or script
 *          - The result of condEntry can be anything as only whether it's
 *            truthy matters
 *          - If the result of condEntry is falsy, this notetag will be
 *            discarded upon such use cases
 *          - The result of statsEntry can be an Array of any natural number
 *          - If statsSuffix is val, then statsEntry should be written as
 *            stat1|stat2|stat3|statI|statN
 *          - E.g.:
 *            <targeting ai anyHighestStatMem switch val: 1, hp|mp> will
 *            restrict the list of targets to be those with highest hp or mp
 *            if the game switch with id 1 is on
 *      18. allHighestStatsMem condSuffix statsSuffix: condEntry, statsEntry
 *          - Applies the following DoubleX RMMZ Unit Filters script call:
 *            allHighestStatsMem(stats, mems)
 *            Where stats is the statsEntry results and mems is the list of
 *            possible targets of the skill/item having this notetag
 *          - condSuffix can be val, switch or script
 *          - statsSuffix can be val, var or script
 *          - The result of condEntry can be anything as only whether it's
 *            truthy matters
 *          - If the result of condEntry is falsy, this notetag will be
 *            discarded upon such use cases
 *          - The result of statsEntry can be an Array of any natural number
 *          - If statsSuffix is val, then statsEntry should be written as
 *            stat1|stat2|stat3|statI|statN
 *          - E.g.:
 *            <targeting ai allHighestStatsMem switch val: 1, hp|mp> will
 *            restrict the list of targets to be those with highest hp and mp
 *            if the game switch with id 1 is on
 *      19. notAnyHighestStatMem condSuffix statsSuffix: condEntry, statsEntry
 *          - Applies the following DoubleX RMMZ Unit Filters script call:
 *            notAnyHighestStatMem(stats, mems)
 *            Where stats is the statsEntry results and mems is the list of
 *            possible targets of the skill/item having this notetag
 *          - condSuffix can be val, switch or script
 *          - statsSuffix can be val, var or script
 *          - The result of condEntry can be anything as only whether it's
 *            truthy matters
 *          - If the result of condEntry is falsy, this notetag will be
 *            discarded upon such use cases
 *          - The result of statsEntry can be an Array of any natural number
 *          - If statsSuffix is val, then statsEntry should be written as
 *            stat1|stat2|stat3|statI|statN
 *          - E.g.:
 *            <targeting ai notAnyHighestStatMem switch val: 1, hp|mp> will
 *            restrict the list of targets to be those without highest hp or
 *            mp if the game switch with id 1 is on
 *      20. notAllHighestStatsMem condSuffix statsSuffix: condEntry, statsEntry
 *          - Applies the following DoubleX RMMZ Unit Filters script call:
 *            notAllHighestStatsMem(stats, mems)
 *            Where stats is the statsEntry results and mems is the list of
 *            possible targets of the skill/item having this notetag
 *          - condSuffix can be val, switch or script
 *          - statsSuffix can be val, var or script
 *          - The result of condEntry can be anything as only whether it's
 *            truthy matters
 *          - If the result of condEntry is falsy, this notetag will be
 *            discarded upon such use cases
 *          - The result of statsEntry can be an Array of any natural
 *            number
 *          - If statsSuffix is val, then statsEntry should be written as
 *            stat1|stat2|stat3|statI|statN
 *          - E.g.:
 *            <targeting ai notAllHighestStatsMem switch val: 1, hp|mp> will
 *            restrict the list of targets to be those without highest hp and
 *            mp if the game switch with id 1 is on
 *      21. anyLowestStatMem condSuffix statsSuffix: condEntry, statsEntry
 *          - Applies the following DoubleX RMMZ Unit Filters script call:
 *            anyLowestStatMem(stats, mems)
 *            Where stats is the statsEntry results and mems is the list of
 *            possible targets of the skill/item having this notetag
 *          - condSuffix can be val, switch or script
 *          - statsSuffix can be val, var or script
 *          - The result of condEntry can be anything as only whether it's
 *            truthy matters
 *          - If the result of condEntry is falsy, this notetag will be
 *            discarded upon such use cases
 *          - The result of statsEntry can be an Array of any natural number
 *          - If statsSuffix is val, then statsEntry should be written as
 *            stat1|stat2|stat3|statI|statN
 *          - E.g.:
 *            <targeting ai anyLowestStatMem switch val: 1, hp|mp> will
 *            restrict the list of targets to be those with highest hp or mp
 *            if the game switch with id 1 is on
 *      22. allLowestStatsMem condSuffix statsSuffix: condEntry, statsEntry
 *          - Applies the following DoubleX RMMZ Unit Filters script call:
 *            allLowestStatsMem(stats, mems)
 *            Where stats is the statsEntry results and mems is the list of
 *            possible targets of the skill/item having this notetag
 *          - condSuffix can be val, switch or script
 *          - statsSuffix can be val, var or script
 *          - The result of condEntry can be anything as only whether it's
 *            truthy matters
 *          - If the result of condEntry is falsy, this notetag will be
 *            discarded upon such use cases
 *          - The result of statsEntry can be an Array of any natural number
 *          - If statsSuffix is val, then statsEntry should be written as
 *            stat1|stat2|stat3|statI|statN
 *          - E.g.:
 *            <targeting ai allLowestStatsMem switch val: 1, hp|mp> will
 *            restrict the list of targets to be those with highest hp and mp
 *            if the game switch with id 1 is on
 *      23. notAnyLowestStatMem condSuffix statsSuffix: condEntry, statsEntry
 *          - Applies the following DoubleX RMMZ Unit Filters script call:
 *            notAnyLowestStatMem(stats, mems)
 *            Where stats is the statsEntry results and mems is the list of
 *            possible targets of the skill/item having this notetag
 *          - condSuffix can be val, switch or script
 *          - statsSuffix can be val, var or script
 *          - The result of condEntry can be anything as only whether it's
 *            truthy matters
 *          - If the result of condEntry is falsy, this notetag will be
 *            discarded upon such use cases
 *          - The result of statsEntry can be an Array of any natural number
 *          - If statsSuffix is val, then statsEntry should be written as
 *            stat1|stat2|stat3|statI|statN
 *          - E.g.:
 *            <targeting ai notAnyLowestStatMem switch val: 1, hp|mp> will
 *            restrict the list of targets to be those without highest hp or
 *            mp if the game switch with id 1 is on
 *      24. notAllLowestStatsMem condSuffix statsSuffix: condEntry, statsEntry
 *          - Applies the following DoubleX RMMZ Unit Filters script call:
 *            notAllLowestStatsMem(stats, mems)
 *            Where stats is the statsEntry results and mems is the list of
 *            possible targets of the skill/item having this notetag
 *          - condSuffix can be val, switch or script
 *          - statsSuffix can be val, var or script
 *          - The result of condEntry can be anything as only whether it's
 *            truthy matters
 *          - If the result of condEntry is falsy, this notetag will be
 *            discarded upon such use cases
 *          - The result of statsEntry can be an Array of any natural
 *            number
 *          - If statsSuffix is val, then statsEntry should be written as
 *            stat1|stat2|stat3|statI|statN
 *          - E.g.:
 *            <targeting ai notAllLowestStatsMem switch val: 1, hp|mp> will
 *            restrict the list of targets to be those without highest hp and
 *            mp if the game switch with id 1 is on
 *      25. anyAboveStatMem condSuffix statsSuffix valSuffix: condEntry, statsEntry, valEntry
 *          - Applies the following DoubleX RMMZ Unit Filters script call:
 *            anyLowestStatMem(stats, val, mems)
 *            Where stats is the statsEntry results, val is the valEntry
 *            results, and mems is the list of possible targets of the
 *            skill/item having this notetag
 *          - condSuffix can be val, switch or script
 *          - statsSuffix can be val, var or script
 *          - valSuffix can be val, var or script
 *          - The result of condEntry can be anything as only whether it's
 *            truthy matters
 *          - If the result of condEntry is falsy, this notetag will be
 *            discarded upon such use cases
 *          - The result of statsEntry can be an Array of any natural number
 *          - If statsSuffix is val, then statsEntry should be written as
 *            stat1|stat2|stat3|statI|statN
 *          - The result of valEntry can be any number
 *          - E.g.:
 *            <targeting ai anyAboveStatMem switch val var: 1, hp|mp, 2> will
 *            restrict the list of targets to be those with hp or mp above the
 *            value of the game variable with id 2 if the game switch with id
 *            1 is on
 *      26. allAboveStatMem condSuffix statsSuffix valSuffix: condEntry, statsEntry, valEntry
 *          - Applies the following DoubleX RMMZ Unit Filters script call:
 *            allAboveStatMem(stats, val, mems)
 *            Where stats is the statsEntry results, val is the valEntry
 *            results, and mems is the list of possible targets of the
 *            skill/item having this notetag
 *          - condSuffix can be val, switch or script
 *          - statsSuffix can be val, var or script
 *          - valSuffix can be val, var or script
 *          - The result of condEntry can be anything as only whether it's
 *            truthy matters
 *          - If the result of condEntry is falsy, this notetag will be
 *            discarded upon such use cases
 *          - The result of statsEntry can be an Array of any natural number
 *          - If statsSuffix is val, then statsEntry should be written as
 *            stat1|stat2|stat3|statI|statN
 *          - The result of valEntry can be any number
 *          - E.g.:
 *            <targeting ai allAboveStatMem switch val var: 1, hp|mp, 2> will
 *            restrict the list of targets to be those with hp and mp above
 *            the value of the game variable with id 2 if the game switch with
 *            id 1 is on
 *      27. anyBelowStatMem condSuffix statsSuffix valSuffix: condEntry, statsEntry, valEntry
 *          - Applies the following DoubleX RMMZ Unit Filters script call:
 *            anyLowestStatMem(stats, val, mems)
 *            Where stats is the statsEntry results, val is the valEntry
 *            results, and mems is the list of possible targets of the
 *            skill/item having this notetag
 *          - condSuffix can be val, switch or script
 *          - statsSuffix can be val, var or script
 *          - valSuffix can be val, var or script
 *          - The result of condEntry can be anything as only whether it's
 *            truthy matters
 *          - If the result of condEntry is falsy, this notetag will be
 *            discarded upon such use cases
 *          - The result of statsEntry can be an Array of any natural number
 *          - If statsSuffix is val, then statsEntry should be written as
 *            stat1|stat2|stat3|statI|statN
 *          - The result of valEntry can be any number
 *          - E.g.:
 *            <targeting ai anyBelowStatMem switch val var: 1, hp|mp, 2> will
 *            restrict the list of targets to be those with hp or mp below the
 *            value of the game variable with id 2 if the game switch with id
 *            1 is on
 *      28. allBelowStatMem condSuffix statsSuffix valSuffix: condEntry, statsEntry, valEntry
 *          - Applies the following DoubleX RMMZ Unit Filters script call:
 *            allBelowStatMem(stats, val, mems)
 *            Where stats is the statsEntry results, val is the valEntry
 *            results, and mems is the list of possible targets of the
 *            skill/item having this notetag
 *          - condSuffix can be val, switch or script
 *          - statsSuffix can be val, var or script
 *          - valSuffix can be val, var or script
 *          - The result of condEntry can be anything as only whether it's
 *            truthy matters
 *          - If the result of condEntry is falsy, this notetag will be
 *            discarded upon such use cases
 *          - The result of statsEntry can be an Array of any natural number
 *          - If statsSuffix is val, then statsEntry should be written as
 *            stat1|stat2|stat3|statI|statN
 *          - The result of valEntry can be any number
 *          - E.g.:
 *            <targeting ai allBelowStatMem switch val var: 1, hp|mp, 2> will
 *            restrict the list of targets to be those with hp and mp below
 *            the value of the game variable with id 2 if the game switch with
 *            id 1 is on
 *      (Advanced)29. or condSuffix: condEntry
 *          - Acts as the or operator among the list of effective notetags in
 *            this plugin upon making action targets
 *          - condSuffix can be val, switch or script
 *          - The result of condEntry can be anything as only whether it's
 *            truthy matters
 *          - If the result of condEntry is falsy, this notetag will be
 *            discarded upon such use cases
 *          - All filtered target groups separated by the or notetags will be
 *            joined by the set union operations
 *          - E.g.:
 *            If the battler has an effective state with the following
 *            effective notetags in this plugin:
 *            <targeting ai anyBelowStatMem switch val var: 1, hp|mp, 2>
 *            <targeting ai allBelowStatMem switch val var: 3, mhp|mmp, 4>
 *            <targeting ai or val: true>
 *            <targeting ai anyAboveStatMem switch val var: 5, atk|def, 6>
 *            <targeting ai allAboveStatMem switch val var: 7, mat|mdf, 8>
 *            <targeting ai or val: false>
 *            <targeting ai notAnyLowestStatsMem switch val: 9, agi|luk>
 *            <targeting ai notAllLowestStatsMem switch val: 10, hit|eva>
 *            And if that battler has the following effective notetags in this
 *            plugin:
 *            <targeting ai notAnyHighestStatsMem switch val: 11, cri|cev>
 *            <targeting ai notAllHighestStatsMem switch val: 12, mev|mrf>
 *            And if the inputted skill/item has the following effective
 *            notetags in this plugin:
 *            <targeting ai or val: true>
 *            <targeting ai anyHighestStatMem switch val: 13, cnt|hrg>
 *            <targeting ai allHighestStatMem switch val: 14, mrg|trg>
 *            Then if the notetag data type priorities are states, battler,
 *            latest skill/item, the inputted actions will select targets
 *            among those filtered by:
 *            <targeting ai anyBelowStatMem switch val var: 1, hp|mp, 2>
 *            <targeting ai allBelowStatMem switch val var: 3, mhp|mmp, 4>
 *            Or:
 *            <targeting ai anyAboveStatMem switch val var: 5, atk|def, 6>
 *            <targeting ai allAboveStatMem switch val var: 7, mat|mdf, 8>
 *            <targeting ai notAnyLowestStatsMem switch val: 9, agi|luk>
 *            <targeting ai notAllLowestStatsMem switch val: 10, hit|eva>
 *            <targeting ai notAnyHighestStatsMem switch val: 11, cri|cev>
 *            <targeting ai notAllHighestStatsMem switch val: 12, mev|mrf>
 *            Or:
 *            <targeting ai anyHighestStatMem switch val: 13, cnt|hrg>
 *            <targeting ai allHighestStatMem switch val: 14, mrg|trg>
 *      (v1.01a+)30. memWithAnyUsableSkill condSuffix skillIdsSuffix: condEntry, skillIdsEntry
 *          - Applies the following DoubleX RMMZ Unit Filters script call:
 *            memWithAnyUsableSkill(skillIds, mems)
 *            Where skillIds is the skillIdsEntry results and mems is the list
 *            of possible targets of the skill/item having this notetag
 *          - condSuffix can be val, switch or script
 *          - skillIdsSuffix can be val, var or script
 *          - The result of condEntry can be anything as only whether it's
 *            truthy matters
 *          - If the result of condEntry is falsy, this notetag will be
 *            discarded upon such use cases
 *          - The result of skillIdsEntry can be an Array of any natural
 *            number
 *          - If skillIdsSuffix is val, then skillIdsEntry should be written
 *            as skillId1|skillId2|skillId3|skillIdI|skillIdN
 *          - E.g.:
 *            <targeting ai memWithAnyUsableSkill switch val: 1, 2|3> will
 *            restrict the list of targets to be those with usable skill with
 *            id 2 or 3 if the game switch with id 1 is on
 *      (v1.01a+)31. memWithAllUsableSkills condSuffix skillIdsSuffix: condEntry, skillIdsEntry
 *          - Applies the following DoubleX RMMZ Unit Filters script call:
 *            memWithAllUsableSkills(skillIds, mems)
 *            Where skillIds is the skillIdsEntry results and mems is the list
 *            of possible targets of the skill/item having this notetag
 *          - condSuffix can be val, switch or script
 *          - skillIdsSuffix can be val, var or script
 *          - The result of condEntry can be anything as only whether it's
 *            truthy matters
 *          - If the result of condEntry is falsy, this notetag will be
 *            discarded upon such use cases
 *          - The result of skillIdsEntry can be an Array of any natural
 *            number
 *          - If skillIdsSuffix is val, then skillIdsEntry should be written
 *            as skillId1|skillId2|skillId3|skillIdI|skillIdN
 *          - E.g.:
 *            <targeting ai memWithAllUsableSkills switch val: 1, 2|3> will
 *            restrict the list of targets to be those with usable skill with
 *            id 2 and 3 if the game switch with id 1 is on
 *      (v1.01a+)32. memWithoutAnyUsableSkill condSuffix skillIdsSuffix: condEntry, skillIdsEntry
 *          - Applies the following DoubleX RMMZ Unit Filters script call:
 *            memWithoutAnyUsableSkill(skillIds, mems)
 *            Where skillIds is the skillIdsEntry results and mems is the list
 *            of possible targets of the skill/item having this notetag
 *          - condSuffix can be val, switch or script
 *          - skillIdsSuffix can be val, var or script
 *          - The result of condEntry can be anything as only whether it's
 *            truthy matters
 *          - If the result of condEntry is falsy, this notetag will be
 *            discarded upon such use cases
 *          - The result of skillIdsEntry can be an Array of any natural
 *            number
 *          - If skillIdsSuffix is val, then skillIdsEntry should be written
 *            as skillId1|skillId2|skillId3|skillIdI|skillIdN
 *          - E.g.:
 *            <targeting ai memWithoutAnyUsableSkill switch val: 1, 2|3> will
 *            restrict the list of targets to be those with usable skill
 *            without id 2 or 3 if the game switch with id 1 is on
 *      (v1.01a+)33. memWithoutAllUsableSkills condSuffix skillIdsSuffix: condEntry, skillIdsEntry
 *          - Applies the following DoubleX RMMZ Unit Filters script call:
 *            memWithoutAllUsableSkills(skillIds, mems)
 *            Where skillIds is the skillIdsEntry results and mems is the list
 *            of possible targets of the skill/item having this notetag
 *          - condSuffix can be val, switch or script
 *          - skillIdsSuffix can be val, var or script
 *          - The result of condEntry can be anything as only whether it's
 *            truthy matters
 *          - If the result of condEntry is falsy, this notetag will be
 *            discarded upon such use cases
 *          - The result of skillIdsEntry can be an Array of any natural
 *            number
 *          - If skillIdsSuffix is val, then skillIdsEntry should be written
 *            as skillId1|skillId2|skillId3|skillIdI|skillIdN
 *          - E.g.:
 *            <targeting ai memWithoutAllUsableSkills switch val: 1, 2|3> will
 *            restrict the list of targets to be those with usable skill
 *            without id 2 and 3 if the game switch with id 1 is on


Script Calls
*    # Parameter manipulations
 *      1. $gameSystem.setTargetingAIParam(param, val)
 *        - Sets the fully parsed value of the parameter param as val
 *        - param must be the name of a valid parameter of this plugin
 *        - val must be a valid new fully parsed value of the parameter param
 *        - Such parameter value changes will be saved
 *        - E.g.:
 *          $gameSystem.setTargetingAIParam("notetagDataTypePriorities", [
 *              "states",
 *              "armors",
 *              "weapons",
 *              "class",
 *              "actor",
 *              "enemy"
 *          ]) sets the fully parsed value of the parameter
 *          notetagDataTypePriorities as
 *          ["states", "armors", "weapons", "class", "actor", "enemy"]
 *      2. $gameSystem.targetingAIParam(param)
 *        - Returns the fully parsed value of the parameter param
 *        - param must be the name of a valid parameter of this plugin
 *        - E.g.:
 *          $gameSystem.targetingAIParam("notetagDataTypePriorities") returns
 *          the fully parsed value of the parameter
 *          notetagDataTypePriorities, which should be
 *          ["states", "armors", "weapons", "class", "actor", "enemy"] if it
 *          uses its default parameter value


Plugin Commands
* @command setTargetingAIParam
 * @desc Applies script call $gameSystem.setTargetingAIParam(param, val)
 * @arg param
 * @desc The name of a valid parameter of this plugin
 * @arg val
 * @desc A valid new fully parsed value of the parameter param


Author Notes
*      1. All notetags of this plugins are just applying script calls in
 *        DoubleX RMMZ Unit Filters unit manipulation script calls, so you're
 *        highly encouraged and recommended to have a basic knowledge on what
 *        they do in general, even though it's not strictly needed to use
 *        this plugin


Prerequisites
Plugins:
1. DoubleX RMMZ Enhanced Codebase
2. DoubleX RMMZ Unit Filters
Abilities:
1. Nothing special for most ordinary cases
2. Little RMMZ plugin development proficiency to fully utilize this(Elementary Javascript exposures being able to write beginner codes up to 300LoC scale)

Terms Of Use
*      1. Commercial use's always allowed and crediting me's always optional.
 *      2. You shall keep this plugin's Plugin Info part's contents intact.
 *      3. You shalln't claim that this plugin's written by anyone other than
 *        DoubleX or my aliases. I always reserve the right to deny you from
 *        using any of my plugins anymore if you've violated this.
 *      4. If you repost this plugin directly(rather than just linking back),
 *        you shall inform me of these direct repostings. I always reserve
 *        the right to request you to edit those direct repostings.
 *      5. CC BY 4.0, except those conflicting with any of the above, applies
 *        to this plugin, unless you've my permissions not needing follow so.
 *      6. I always reserve the right to deny you from using this plugin
 *        anymore if you've violated any of the above.


Contributors
*      Authors:
 *      1. DoubleX
 *      Plugin Development Collaborators:
 *      - None So Far
 *      Bug Reporters:
 *      - None So Far
 *      Compatibility Issue Raisers:
 *      - None So Far
 *      Feature Requesters:
 *      - None So Far


Changelog
*      { codebase: "1.1.0", plugin: "v1.01b" }(2020 Dec 2 GMT 0400):
 *      1. You no longer have to edit the value of
 *        DoubleX_RMMZ.Targeting_AI.PLUGIN_NAME when changing this plugin
 *        file name
*      { codebase: "1.0.0", plugin: "v1.01a" }(2020 Aug 28 GMT 0100):
 *      1. Added the following notetags -
 *        - memWithAnyUsableSkill
 *        - memWithAllUsableSkills
 *        - memWithoutAnyUsableSkill
 *        - memWithoutAllUsableSkills
 *      { codebase: "1.0.0", plugin: "v1.00a" }(2020 Aug 25 GMT 0400):
 *      1. 1st version of this plugin finished


Download Link
Demo Link
25
RMMZ Script Database / [MZ] DoubleX RMMZ Unit Filters
August 24, 2020, 02:36:38 am
DoubleX RMMZ Unit Filters
Authors: DoubleX
Version: v1.02a
Type: Party/Troop member filtering Add-on
Key Term: Player / Party / Troop Add-on

Purpose
Lets you use script calls to filter unit members with less codes and eventing

Introduction
*      1. Without any plugin, getting a member with specific conditions
*        relative to the belonging unit, like finding the party member with
*        the highest amount of hp, demands relatively heavy event setups,
*        even with the aid of common events, which boost event reusability.
*      2. With this plugin, the same can be done using several easy, simple
*        and small script calls instead of writing several common events
*        from scratch, thus further improving effectiveness and efficiency.

Video(v1.02a+)
(You'll have to use DoubleX_RMMZ_Plugin_Query to use the plugin queries of this plugin)


Games using this plugin
None so far

Script Calls
*    # Battler manipulations
 *      1. isAnyStateAffected(stateIds)
 *        - Returns whether the battler involved has any state included by
 *          stateIds, which is a list of id of states
 *        - stateIds must be an Array of natural numbers
 *        - E.g.:
 *          $gameParty.members()
.isAnyStateAffected([1, 2]) returns *          whether the 1st party member has any state with id 1 or 2
 *      2. isAllStatesAffected(stateIds)
 *        - Returns whether the battler involved has all states included by
 *          stateIds, which is a list of id of states
 *        - stateIds must be an Array of natural numbers
 *        - E.g.:
 *          $gameActors.actor(1).isAllStatesAffected([1, 2]) returns whether
 *          the actor with id 1 has all states with id 1 or 2
 *      3. isAnyBuffAffected(paramIds)
 *        - Returns whether the battler involved has any buff included by
 *          paramIds, which is a list of id of corresponding parameters
 *        - paramIds must be an Array of non negative numbers
 *        - E.g.:
 *          $gameParty.members()
.isAnyBuffAffected([0, 1]) returns *          whether the 1st party member has any mhp or mmp buff
 *      4. isAllBuffsAffected(paramIds)
 *        - Returns whether the battler involved has all buffs included by
 *          paramIds, which is a list of id of corresponding parameters
 *        - paramIds must be an Array of non negative numbers
 *        - E.g.:
 *          $gameActors.actor(1).isAllBuffsAffected([0, 1]) returns whether
 *          the actor with id 1 has all mhp and mmp buffs
 *      5. isAnyDebuffAffected(paramIds)
 *        - Returns whether the battler involved has any debuff included by
 *          paramIds, which is a list of id of corresponding parameters
 *        - paramIds must be an Array of non negative numbers
 *        - E.g.:
 *          $gameParty.members()
.isAnyDebuffAffected([0, 1]) returns *          whether the 1st party member has any mhp or mmp debuff
 *      6. isAllDebuffsAffected(paramIds)
 *        - Returns whether the battler involved has all debuffs included by
 *          paramIds, which is a list of id of corresponding parameters
 *        - paramIds must be an Array of non negative numbers
 *        - E.g.:
 *          $gameActors.actor(1).isAllDebuffsAffected([0, 1]) returns whether
 *          the actor with id 1 has all mhp and mmp debuffs
 *      7. hasAnySkill(skillIds)
 *        - Returns whether the battler involved has any skill included by
 *          skillIds, which is a list of id of corresponding skills
 *        - paramIds must be an Array of natural numbers
 *        - E.g.:
 *          $gameParty.members()
.hasAnySkill([1, 2]) returns whether the *          1st party member has skill with id 1 or 2
 *      8. hasAllSkills(skillIds)
 *        - Returns whether the battler involved has all skills included by
 *          skillIds, which is a list of id of corresponding skills
 *        - paramIds must be an Array of natural numbers
 *        - E.g.:
 *          $gameActors.actor(1).hasAllSkills([1, 2]) returns whether the
 *          actor with id 1 has all skills with id 1 and 2
 *      (v1.01a+)9. hasAnyUsableSkill(skillIds)
 *        - Returns whether the battler involved has any usable skill
 *          included by skillIds, which is a list of id of corresponding
 *          skills
 *        - paramIds must be an Array of natural numbers
 *        - E.g.:
 *          $gameParty.members()
.hasAnyUsableSkill([1, 2]) returns whether *          the 1st party member has usable skill with id 1 or 2
 *      (v1.01a+)10. hasAllUsableSkills(skillIds)
 *          - Returns whether the battler involved has all usable skills
 *            included by skillIds, which is a list of id of corresponding
 *            skills
 *          - paramIds must be an Array of natural numbers
 *          - E.g.:
 *            $gameActors.actor(1).hasAllUsableSkills([1, 2]) returns whether
 *            the actor with id 1 has all usable skills with id 1 and 2
 *    # Unit manipulations
 *      1. memWithAnyState(stateIds, mems)
 *        - Returns the list of members with any state included by stateIds,
 *          which is a list of id of states, among all battlers included by
 *          mems, which is a list of battlers
 *        - The return value should be an Array of Game_Battler
 *        - stateIds must be an Array of natural numbers
 *        - mems must be an Array of Game_Battler
 *        - If mems isn't specified, it'll be default to all unit members
 *          outside battles and battle members inside battles respectively
 *        - E.g.:
 *          $gameParty.memWithAnyState([1, 2]) returns the list of party
 *          members with any state with id 1 or 2
 *      2. memWithAllStates(stateIds, mems)
 *        - Returns the list of members with all states included by
 *          stateIds, which is a list of id of states, among all battlers
 *          included by mems, which is a list of battlers
 *        - The return value should be an Array of Game_Battler
 *        - stateIds must be an Array of natural numbers
 *        - mems must be an Array of Game_Battler
 *        - If mems isn't specified, it'll be default to all unit members
 *          outside battles and battle members inside battles respectively
 *        - E.g.:
 *          $gameTroop.memWithAllStates([1, 2], $gameTroop.memWithAnyState([3, 4]))
 *          returns the list of troop members with all states with id 1 or 2
 *          among those with any state with id 3 or 4
 *      3. memWithoutAnyState(stateIds, mems)
 *        - Returns the list of members without any state included by
 *          stateIds, which is a list of id of states, among all battlers
 *          included by mems, which is a list of battlers
 *        - The return value should be an Array of Game_Battler
 *        - stateIds must be an Array of natural numbers
 *        - mems must be an Array of Game_Battler
 *        - If mems isn't specified, it'll be default to all unit members
 *          outside battles and battle members inside battles respectively
 *        - E.g.:
 *          $gameParty.memWithoutAnyState([1, 2]) returns the list of party
 *          members without any state with id 1 or 2
 *      4. memWithoutAllStates(stateIds, mems)
 *        - Returns the list of members without all states included by
 *          stateIds, which is a list of id of states, among all battlers
 *          included by mems, which is a list of battlers
 *        - The return value should be an Array of Game_Battler
 *        - stateIds must be an Array of natural numbers
 *        - mems must be an Array of Game_Battler
 *        - If mems isn't specified, it'll be default to all unit members
 *          outside battles and battle members inside battles respectively
 *        - E.g.:
 *          $gameTroop.memWithoutAllStates([1, 2], $gameTroop.memWithoutAnyState([3, 4]))
 *          returns the list of troop members without all states with id 1 or
 *          2 among those without any state with id 1 or 2
 *      5. memWithAnyBuff(paramIds, mems)
 *        - Returns the list of members with any buff included by paramIds,
 *          which is a list of id of corresponding parameters, among all
 *          battlers included by mems, which is a list of battlers
 *        - The return value should be an Array of Game_Battler
 *        - paramIds must be an Array of non negative numbers
 *        - mems must be an Array of Game_Battler
 *        - If mems isn't specified, it'll be default to all unit members
 *          outside battles and battle members inside battles respectively
 *        - E.g.:
 *          $gameParty.memWithAnyBuff([0, 1]) returns the list of party
 *          members with any mhp or mmp buff
 *      6. memWithAllBuffs(paramIds, mems)
 *        - Returns the list of members with all buffs included by paramIds,
 *          which is a list of id of corresponding parameters, among all
 *          battlers included by mems, which is a list of battlers
 *        - The return value should be an Array of Game_Battler
 *        - paramIds must be an Array of non negative numbers
 *        - mems must be an Array of Game_Battler
 *        - If mems isn't specified, it'll be default to all unit members
 *          outside battles and battle members inside battles respectively
 *        - E.g.:
 *          $gameTroop.memWithAllBuffs([0, 1], $gameTroop.memWithAnyBuff([2, 3]))
 *          returns the list of troop members with all mhp and mmp buffs
 *          among those with any atk or def buff
 *      7. memWithoutAnyBuff(paramIds, mems)
 *        - Returns the list of members without any buff included by
 *          paramIds, which is a list of id of corresponding parameters,
 *          among all battlers included by mems, which is a list of battlers
 *        - The return value should be an Array of Game_Battler
 *        - paramIds must be an Array of non negative numbers
 *        - mems must be an Array of Game_Battler
 *        - If mems isn't specified, it'll be default to all unit members
 *          outside battles and battle members inside battles respectively
 *        - E.g.:
 *          $gameParty.memWithoutAnyBuff([0, 1]) returns the list of party
 *          members without any mhp or mmp buff
 *      8. memWithoutAllBuffs(paramIds, mems)
 *        - Returns the list of members without all buffs included by
 *          paramIds, which is a list of id of corresponding parameters,
 *          among all battlers included by mems, which is a list of battlers
 *        - The return value should be an Array of Game_Battler
 *        - paramIds must be an Array of non negative numbers
 *        - mems must be an Array of Game_Battler
 *        - If mems isn't specified, it'll be default to all unit members
 *          outside battles and battle members inside battles respectively
 *        - E.g.:
 *          $gameTroop.memWithoutAllBuffs([0, 1], $gameTroop.memWithoutAnyBuff([2, 3]))
 *          returns the list of troop members without all mhp and mmp buffs
 *          among those without any atk or def buff
 *      9. memWithAnyDebuff(paramIds, mems)
 *        - Returns the list of members with any debuff included by paramIds,
 *          which is a list of id of corresponding parameters, among all
 *          battlers included by mems, which is a list of battlers
 *        - The return value should be an Array of Game_Battler
 *        - paramIds must be an Array of non negative numbers
 *        - mems must be an Array of Game_Battler
 *        - If mems isn't specified, it'll be default to all unit members
 *          outside battles and battle members inside battles respectively
 *        - E.g.:
 *          $gameParty.memWithAnyDebuff([0, 1]) returns the list of party
 *          members with any mhp or mmp debuff
 *      10. memWithAllDebuffs(paramIds, mems)
 *        - Returns the list of members with all debuffs included by
 *          paramIds, which is a list of id of corresponding parameters,
 *          among all battlers included by mems, which is a list of battlers
 *        - The return value should be an Array of Game_Battler
 *        - paramIds must be an Array of non negative numbers
 *        - mems must be an Array of Game_Battler
 *        - If mems isn't specified, it'll be default to all unit members
 *          outside battles and battle members inside battles respectively
 *        - E.g.:
 *          $gameTroop.memWithAllDebuffs([0, 1], $gameTroop.memWithAnyDebuff([2, 3]))
 *          returns the list of troop members with all mhp and mmp debuffs
 *          among those with any atk or def debuff
 *      11. memWithoutAnyDebuff(paramIds, mems)
 *        - Returns the list of members without any debuff included by
 *          paramIds, which is a list of id of corresponding parameters,
 *          among all battlers included by mems, which is a list of battlers
 *        - The return value should be an Array of Game_Battler
 *        - paramIds must be an Array of non negative numbers
 *        - mems must be an Array of Game_Battler
 *        - If mems isn't specified, it'll be default to all unit members
 *          outside battles and battle members inside battles respectively
 *        - E.g.:
 *          $gameParty.memWithoutAnyDebuff([0, 1]) returns the list of party
 *          members without any mhp or mmp debuff
 *      12. memWithoutAllDebuffs(paramIds, mems)
 *        - Returns the list of members without all debuffs included by
 *          paramIds, which is a list of id of corresponding parameters,
 *          among all battlers included by mems, which is a list of battlers
 *        - The return value should be an Array of Game_Battler
 *        - paramIds must be an Array of non negative numbers
 *        - mems must be an Array of Game_Battler
 *        - If mems isn't specified, it'll be default to all unit members
 *          outside battles and battle members inside battles respectively
 *        - E.g.:
 *          $gameTroop.memWithoutAllDebuffs([0, 1], $gameTroop.memWithoutAnyDebuff([2, 3]))
 *          returns the list of troop members without all mhp and mmp debuffs
 *          among those without any atk or def debuff
 *      13. memWithAnySkill(skillIds, mems)
 *        - Returns the list of members with any skill included by skillIds,
 *          which is a list of id of corresponding skills, among all battlers
 *          included by mems, which is a list of battlers
 *        - The return value should be an Array of Game_Battler
 *        - skillIds must be an Array of natural numbers
 *        - mems must be an Array of Game_Battler
 *        - If mems isn't specified, it'll be default to all unit members
 *          outside battles and battle members inside battles respectively
 *        - E.g.:
 *          $gameParty.memWithAnySkill([1, 2]) returns the list of party
 *          members with skill having id 1 or 2
 *      14. memWithAllSkills(skillIds, mems)
 *        - Returns the list of members with all skills included by skillIds,
 *          which is a list of id of corresponding skills, among all battlers
 *          included by mems, which is a list of battlers
 *        - The return value should be an Array of Game_Battler
 *        - skillIds must be an Array of natural numbers
 *        - mems must be an Array of Game_Battler
 *        - If mems isn't specified, it'll be default to all unit members
 *          outside battles and battle members inside battles respectively
 *        - E.g.:
 *          $gameTroop.memWithAllSkills([1, 2], $gameParty.memWithAnySkill([3, 4]))
 *          returns the list of troop members with skills having id 1 and 2
 *          among those with skill having id 3 or 4
 *      15. memWithoutAnySkill(skillIds, mems)
 *        - Returns the list of members without any skill included by
 *          skillIds, which is a list of id of corresponding skills, among
 *          all battlers included by mems, which is a list of battlers
 *        - The return value should be an Array of Game_Battler
 *        - skillIds must be an Array of natural numbers
 *        - mems must be an Array of Game_Battler
 *        - If mems isn't specified, it'll be default to all unit members
 *          outside battles and battle members inside battles respectively
 *        - E.g.:
 *          $gameParty.memWithoutAnySkill([1, 2]) returns the list of party
 *          members without skills having id 1 nor 2
 *      16. memWithoutAllSkills(skillIds, mems)
 *        - Returns the list of members without all skills included by
 *          skillIds, which is a list of id of corresponding skills, among
 *          all battlers included by mems, which is a list of battlers
 *        - The return value should be an Array of Game_Battler
 *        - skillIds must be an Array of natural numbers
 *        - mems must be an Array of Game_Battler
 *        - If mems isn't specified, it'll be default to all unit members
 *          outside battles and battle members inside battles respectively
 *        - E.g.:
 *          $gameTroop.memWithoutAllSkills([1, 2], $gameParty.memWithoutAnySkill([3, 4]))
 *          returns the list of troop members without skills having id 1 and
 *          2 among those without skill having id 3 or 4
 *      17. anyHighestStatMem(stats, mems)
 *        - Returns the list of members whose values of
 *          parameters/ex-parameters/sp-parameters included by stats, which
 *          is a list of names of corresponding
 *          parameters/ex-parameters/sp-parameters, include those being the
 *          highest among the caller, among all battlers included by mems,
 *          which is a list of battlers
 *        - The return value should be an Array of Game_Battler
 *        - stats must be an Array of strings as names of Game_Battler
 *          properties with the get function
 *        - mems must be an Array of Game_Battler
 *        - If mems isn't specified, it'll be default to all unit members
 *          outside battles and battle members inside battles respectively
 *        - E.g.:
 *          $gameParty.anyHighestStatMem(["hp", "mp"]) returns the list of
 *          party members with the highest amount of hp or mp among the party
 *      18. allHighestStatsMem(stats, mems)
 *        - Returns the list of members whose values of
 *          parameters/ex-parameters/sp-parameters included by stats, which
 *          is a list of names of corresponding
 *          parameters/ex-parameters/sp-parameters, are all the highest among
 *          the caller, among all battlers included by mems, which is a list
 *          of battlers
 *        - The return value should be an Array of Game_Battler
 *        - stats must be an Array of strings as names of Game_Battler
 *          properties with the get function
 *        - mems must be an Array of Game_Battler
 *        - If mems isn't specified, it'll be default to all unit members
 *          outside battles and battle members inside battles respectively
 *        - E.g.:
 *          $gameTroop.allHighestStatsMem(["hp", "mp"], $gameTroop.anyHighestStatMem(["mhp", "mmp"]))
 *          returns the list of troop members with the highest amount of hp
 *          and mp among those with the highest amount of mhp or mmp among
 *          the troop
 *      19. notAnyHighestStatMem(stats, mems)
 *        - Returns the list of members whose values of
 *          parameters/ex-parameters/sp-parameters included by stats, which
 *          is a list of names of corresponding
 *          parameters/ex-parameters/sp-parameters, don't include those being
 *          the highest among the caller, among all battlers included by
 *          mems, which is a list of battlers
 *        - The return value should be an Array of Game_Battler
 *        - stats must be an Array of strings as names of Game_Battler
 *          properties with the get function
 *        - mems must be an Array of Game_Battler
 *        - If mems isn't specified, it'll be default to all unit members
 *          outside battles and battle members inside battles respectively
 *        - E.g.:
 *          $gameParty.notAnyHighestStatMem(["hp", "mp"]) returns the list of
 *          party members with neither the highest amount of hp nor mp among
 *          the party
 *      20. notAllHighestStatsMem(stats, mems)
 *        - Returns the list of members whose values of
 *          parameters/ex-parameters/sp-parameters included by stats, which
 *          is a list of names of corresponding
 *          parameters/ex-parameters/sp-parameters, aren't all the highest
 *          among the caller, among all battlers included by mems, which is
 *          a list of battlers
 *        - The return value should be an Array of Game_Battler
 *        - stats must be an Array of strings as names of Game_Battler
 *          properties with the get function
 *        - mems must be an Array of Game_Battler
 *        - If mems isn't specified, it'll be default to all unit members
 *          outside battles and battle members inside battles respectively
 *        - E.g.:
 *          $gameTroop.notAllHighestStatsMem(["hp", "mp"], $gameTroop.notAnyHighestStatMem(["mhp", "mmp"]))
 *          returns the list of troop members without the highest amount of
 *          both hp and mp among those with neither the highest amount of mhp
 *          nor mmp among the troop
 *      21. anyLowestStatMem(stats, mems)
 *        - Returns the list of members whose values of
 *          parameters/ex-parameters/sp-parameters included by stats, which
 *          is a list of names of corresponding
 *          parameters/ex-parameters/sp-parameters, include those being the
 *          lowest among the caller, among all battlers included by mems,
 *          which is a list of battlers
 *        - The return value should be an Array of Game_Battler
 *        - stats must be an Array of strings as names of Game_Battler
 *          properties with the get function
 *        - mems must be an Array of Game_Battler
 *        - If mems isn't specified, it'll be default to all unit members
 *          outside battles and battle members inside battles respectively
 *        - E.g.:
 *          $gameParty.anyLowestStatMem(["hp", "mp"]) returns the list of
 *          party members with the lowest amount of hp or mp among the party
 *      22. allLowestStatsMem(stats, mems)
 *        - Returns the list of members whose values of
 *          parameters/ex-parameters/sp-parameters included by stats, which
 *          is a list of names of corresponding
 *          parameters/ex-parameters/sp-parameters, are all the lowest among
 *          the caller, among all battlers included by mems, which is a list
 *          of battlers
 *        - The return value should be an Array of Game_Battler
 *        - stats must be an Array of strings as names of Game_Battler
 *          properties with the get function
 *        - mems must be an Array of Game_Battler
 *        - If mems isn't specified, it'll be default to all unit members
 *          outside battles and battle members inside battles respectively
 *        - E.g.:
 *          $gameTroop.allLowestStatsMem(["hp", "mp"], $gameTroop.anyLowestStatMem(["mhp", "mmp"]))
 *          returns the list of troop members with the lowest amount of hp
 *          and mp among those with the lowest amount of mhp or mmp among the
 *          troop
 *      23. notAnyLowestStatMem(stats, mems)
 *        - Returns the list of members whose values of
 *          parameters/ex-parameters/sp-parameters included by stats, which
 *          is a list of names of corresponding
 *          parameters/ex-parameters/sp-parameters, don't include those being
 *          the lowest among the caller, among all battlers included by mems,
 *          which is a list of battlers
 *        - The return value should be an Array of Game_Battler
 *        - stats must be an Array of strings as names of Game_Battler
 *          properties with the get function
 *        - mems must be an Array of Game_Battler
 *        - If mems isn't specified, it'll be default to all unit members
 *          outside battles and battle members inside battles respectively
 *        - E.g.:
 *          $gameParty.notAnyLowestStatMem(["hp", "mp"]) returns the list of
 *          party members with neither the lowest amount of hp nor mp among
 *          the party
 *      24. notAllLowestStatsMem(stats, mems)
 *        - Returns the list of members whose values of
 *          parameters/ex-parameters/sp-parameters included by stats, which
 *          is a list of names of corresponding
 *          parameters/ex-parameters/sp-parameters, aren't all the lowest
 *          among the caller, among all battlers included by mems, which is a
 *          list of battlers
 *        - The return value should be an Array of Game_Battler
 *        - stats must be an Array of strings as names of Game_Battler
 *          properties with the get function
 *        - mems must be an Array of Game_Battler
 *        - If mems isn't specified, it'll be default to all unit members
 *          outside battles and battle members inside battles respectively
 *        - E.g.:
 *          $gameTroop.notAllLowestStatsMem(["hp", "mp"], $gameParty.notAnyLowestStatMem(["mhp", "mmp"]))
 *          returns the list of troop members without the lowest amount of
 *          both hp and mp among those with neither the lowest amount of mhp
 *          nor mmp among the troop
 *      25. anyAboveStatMem(stats, val, mems)
 *        - Returns the list of members whose values of
 *          parameters/ex-parameters/sp-parameters included by stats, which
 *          is a list of names of corresponding
 *          parameters/ex-parameters/sp-parameters, include those above val,
 *          among all battlers included by mems, which is a list of battlers
 *        - The return value should be an Array of Game_Battler
 *        - stats must be an Array of strings as names of Game_Battler
 *          properties with the get function
 *        - val must be a number
 *        - mems must be an Array of Game_Battler
 *        - If mems isn't specified, it'll be default to all unit members
 *          outside battles and battle members inside battles respectively
 *        - E.g.:
 *          $gameParty.anyAboveStatMem(["hp", "mp"], 100) returns the list of
 *          party members with the value of hp or mp above 100
 *      26. allAboveStatMem(stats, val, mems)
 *        - Returns the list of members whose values of
 *          parameters/ex-parameters/sp-parameters included by stats, which
 *          is a list of names of corresponding
 *          parameters/ex-parameters/sp-parameters, are all above val, among
 *          all battlers included by mems, which is a list of battlers
 *        - The return value should be an Array of Game_Battler
 *        - stats must be an Array of strings as names of Game_Battler
 *          properties with the get function
 *        - val must be a number
 *        - mems must be an Array of Game_Battler
 *        - If mems isn't specified, it'll be default to all unit members
 *          outside battles and battle members inside battles respectively
 *        - E.g.:
 *          $gameTroop.allAboveStatMem(["hp", "mp"], 100, $gameTroop.anyAboveStatMem(["mhp", "mmp"], 1000))
 *          returns the list of troop members with the value of hp and mp
 *          above 100 among those with the value of mhp or mmp above 1000
 *      27. anyBelowStatMem(stats, val, mems)
 *        - Returns the list of members whose values of
 *          parameters/ex-parameters/sp-parameters included by stats, which
 *          is a list of names of corresponding
 *          parameters/ex-parameters/sp-parameters, include those below val,
 *          among all battlers included by mems, which is a list of battlers
 *        - The return value should be an Array of Game_Battler
 *        - stats must be an Array of strings as names of Game_Battler
 *          properties with the get function
 *        - val must be a number
 *        - mems must be an Array of Game_Battler
 *        - If mems isn't specified, it'll be default to all unit members
 *          outside battles and battle members inside battles respectively
 *        - E.g.:
 *          $gameParty.anyBelowStatMem(["hp", "mp"], 100) returns the list of
 *          party members with the value of hp or mp below 100
 *      28. allBelowStatMem(stats, val, mems)
 *        - Returns the list of members whose values of
 *          parameters/ex-parameters/sp-parameters included by stats, which
 *          is a list of names of corresponding
 *          parameters/ex-parameters/sp-parameters, are all below val, among
 *          all battlers included by mems, which is a list of battlers
 *        - The return value should be an Array of Game_Battler
 *        - stats must be an Array of strings as names of Game_Battler
 *          properties with the get function
 *        - val must be a number
 *        - mems must be an Array of Game_Battler
 *        - If mems isn't specified, it'll be default to all unit members
 *          outside battles and battle members inside battles respectively
 *        - E.g.:
 *          $gameTroop.allBelowStatMem(["hp", "mp"], 100, $gameTroop.anyBelowStatMem(["mhp", "mmp"], 1000))
 *          returns the list of troop members with the value of hp and mp
 *          below 100 among those with the value of mhp or mmp below 1000
 *      (v1.01a+)29. memWithAnyUsableSkill(skillIds, mems)
 *        - Returns the list of members with any usable skill included by
 *          skillIds, which is a list of id of corresponding skills, among
 *          all battlers included by mems, which is a list of battlers
 *        - The return value should be an Array of Game_Battler
 *        - skillIds must be an Array of natural numbers
 *        - mems must be an Array of Game_Battler
 *        - If mems isn't specified, it'll be default to all unit members
 *          outside battles and battle members inside battles respectively
 *        - E.g.:
 *          $gameParty.memWithAnyUsableSkill([1, 2]) returns the list of
 *          party members with usable skill having id 1 or 2
 *      (v1.01a+)30. memWithAllUsableSkills(skillIds, mems)
 *        - Returns the list of members with all usable skills included by
 *          skillIds, which is a list of id of corresponding skills, among
 *          all battlers included by mems, which is a list of battlers
 *        - The return value should be an Array of Game_Battler
 *        - skillIds must be an Array of natural numbers
 *        - mems must be an Array of Game_Battler
 *        - If mems isn't specified, it'll be default to all unit members
 *          outside battles and battle members inside battles respectively
 *        - E.g.:
 *          $gameTroop.memWithAllUsableSkills([1, 2], $gameParty.memWithAnyUsableSkill([3, 4]))
 *          returns the list of troop members with usable skills having id 1
 *          and 2 among those with usable skill having id 3 or 4
 *      (v1.01a+)31. memWithoutAnyUsableSkill(skillIds, mems)
 *        - Returns the list of members without any usable skill included by
 *          skillIds, which is a list of id of corresponding skills, among
 *          all battlers included by mems, which is a list of battlers
 *        - The return value should be an Array of Game_Battler
 *        - skillIds must be an Array of natural numbers
 *        - mems must be an Array of Game_Battler
 *        - If mems isn't specified, it'll be default to all unit members
 *          outside battles and battle members inside battles respectively
 *        - E.g.:
 *          $gameParty.memWithoutAnyUsableSkill([1, 2]) returns the list of
 *          party members without usable skills having id 1 nor 2
 *      (v1.01a+)32. memWithoutAllUsableSkills(skillIds, mems)
 *        - Returns the list of members without all usable skills included by
 *          skillIds, which is a list of id of corresponding skills, among
 *          all battlers included by mems, which is a list of battlers
 *        - The return value should be an Array of Game_Battler
 *        - skillIds must be an Array of natural numbers
 *        - mems must be an Array of Game_Battler
 *        - If mems isn't specified, it'll be default to all unit members
 *          outside battles and battle members inside battles respectively
 *        - E.g.:
 *          $gameTroop.memWithoutAllUsableSkills([1, 2], $gameParty.memWithoutAnyUsableSkill([3, 4]))
 *          returns the list of troop members without usable skills having id
 *          1 and 2 among those without usable skill having id 3 or 4

Author Notes
*      1. This plugin's meant to be a convenience tool to facilitate the use
 *        of some unit filters that aren't already available from the default
 *        RMMZ codebase, so you're still supposed to write some Javascript
 *        codes with the aid of the new script calls provided by this plugin.

Prerequisites
*      Abilities:
 *      1. Nothing special for most ordinary cases
 *      2. Little RMMZ plugin development proficiency to fully utilize this
 *        (Elementary Javascript exposures being able to write beginner codes
 *        up to 300LoC scale)

Terms Of Use
*      1. Commercial use's always allowed and crediting me's always optional.
 *      2. You shall keep this plugin's Plugin Info part's contents intact.
 *      3. You shalln't claim that this plugin's written by anyone other than
 *        DoubleX or my aliases. I always reserve the right to deny you from
 *        using any of my plugins anymore if you've violated this.
 *      4. If you repost this plugin directly(rather than just linking back),
 *        you shall inform me of these direct repostings. I always reserve
 *        the right to request you to edit those direct repostings.
 *      5. CC BY 4.0, except those conflicting with any of the above, applies
 *        to this plugin, unless you've my permissions not needing follow so.
 *      6. I always reserve the right to deny you from using this plugin
 *        anymore if you've violated any of the above.

Contributors
*      Authors:
 *      1. DoubleX
 *      Plugin Development Collaborators:
 *      - None So Far
 *      Bug Reporters:
 *      - None So Far
 *      Compatibility Issue Raisers:
 *      - None So Far
 *      Feature Requesters:
 *      - None So Far

Changelog
*      { codebase: "1.0.2", plugin: "v1.02a" }(2020 Oct 6 GMT 1600):
 *      1. Added the plugin query and command counterparts for the script
 *        calls of this plugin
*      { codebase: "1.0.0", plugin: "v1.01a" }(2020 Aug 28 GMT 0000):
 *      1. Added the following battler manipulation script calls  -
 *        - hasAnyUsableSkill(skillIds)
 *        - hasAllUsableSkills(skillIds)
 *      2. Added the following unit manipulation script calls  -
 *        - memWithAnyUsableSkill(skillIds, mems)
 *        - memWithAllUsableSkills(skillIds, mems)
 *        - memWithoutAnyUsableSkill(skillIds, mems)
 *        - memWithoutAllUsableSkills(skillIds, mems)
*      { codebase: "1.0.0", plugin: "v1.00a" }(2020 Aug 23 GMT 0400):
 *      1. 1st version of this plugin finished

Download Link
Demo Link
26
I want to post my RPG Maker MZ plugins here but it doesn't seem to have a place for me to do so, so I'd like to know if there is or will be such a place for RPG Maker MZ plugins :)
27
RMMV Script Database / [MV] DoubleX RMMV Unit Filters
October 18, 2017, 03:59:44 am
DoubleX RMMV Unit Filters
Authors: DoubleX
Version: v1.00a
Type: Party/Troop member filtering Add-on
Key Term: Player/Party/Troop Add-on



Introduction

Lets you use plugin calls to use new unit filters in order to write much, much less codes to perform much, much more tasks
 *      1. Without any plugin, getting a member with specific conditions      
*         relative to the belonging unit, like finding the party member with
*         the highest amount of hp, demands relatively heavy event setups,   
*         even with the aid of common events, which boost event reusability.
*      2. With this plugin, the same can be done using several easy, simple 
*         and small plugin calls instead of writing several common events   
*         from scratch, thus further improving effectiveness and efficiency.



Features


       
  • Provides plugin calls to directly declare the results instead of having to care about implementation details




Script

DoubleX RMMV Unit Filters:
https://pastebin.com/ZWZED0UC


Compatibility

No compatibility issues yet.


Credits And Thanks

       
  • DoubleX(Optional)




Author's Notes

 *----------------------------------------------------------------------------
*    # Terms Of Use                                                         
*      1. Commercial use's always allowed and crediting me's always optional.
*      2. You shall keep this plugin's Plugin Info part's contents intact.   
*      3. You shalln't claim that this plugin's written by anyone other than
*         DoubleX or my aliases. I always reserve the right to deny you from
*         using any of my plugins anymore if you've violated this.           
*      4. CC BY 4.0, except those conflicting with any of the above, applies
*         to this plugin, unless you've my permissions not needing follow so.
*      5. I always reserve the right to deny you from using this plugin     
*         anymore if you've violated any of the above.                       
*----------------------------------------------------------------------------
*    # Prerequisites                                                         
*      Abilities:                                                           
*      1. Nothing special for most ordinary cases                           
*      2. Little RMMV plugin development proficiency to fully utilize this   
*----------------------------------------------------------------------------
*    # Author Notes                                                         
*      1. This plugin's meant to be a convenience tool to facilitate the use
*         of some unit filters that aren't already available from the default
*         RMMV codebase, so you're still supposed to write some Javascript   
*         codes with the aid of the new plugin calls provided by this plugin.
*      2. You're supposed to implement unit filter result set operations -   
*         union, intersection, complement, difference, etc - yourselves.     
*----------------------------------------------------------------------------
28
RMMV Script Database / [MV] DoubleX RMMV Skill Hotkeys
September 08, 2017, 02:00:57 pm
DoubleX RMMV Skill Hotkeys
Authors: DoubleX
Version: v1.00a
Type: Actor Skill Input Add-on
Key Term: Actor Add-on



Introduction

Lets you bind hotkeys to skills for actors outside battles, and use them to select usable skills for actors inside battles
 *    1. When the party's out of battles, an actor can bind hotkeys to his/her
*       currently usable/unusable skills in the skill menu, unless the result
*       of the relevant notetags indicates otherwise                         
*       All these bindings will be saved                                     
*    2. When the party's inside battles, an actor having nonempty hotkey slot
*       can use hotkeys to use their corresponding usable skills directly,   
*       unless the result of the relevant notetags indicates otherwise       



Features


       
  • The whole plugin can be disabled/enabled for the next battles

  •    
  • Uses Actor/Class/Weapon/Armor/State/Skill notetags

  •    
  • Provides both plugin calls and plugin commands

  •    
  • Provides extreme control and freedom to those having at least a basic knowledge of what the RMMV codebase does by letting them use Javascript directly




Video

https://www.youtube.com/watch?v=iBaFP_cN5yE


Script

DoubleX RMMV Skill Hotkeys:
https://pastebin.com/iEfRMhf3
DoubleX RMMV Skill Hotkeys Unit Test:
https://pastebin.com/iHh5frL3


Instructions

 *      1. If you want to edit configurations instead of parameters, you must 
*         open this js file to access its configuration region               
*         Some settings, like the hotkey mappings, are only available as     
*         configurations                                                     
*      2. The default plugin file name is DoubleX RMMV Skill Hotkeys v100a   
*         If you want to change that, you must edit the value of             
*         DoubleX_RMMV.Skill_Hotkeys_File, which must be done via opening   
*         this plugin js file directly                                       
*      3. If you wish to use DoubleX RMMV Skill Hotkeys Unit Test, place it 
*         right below this plugin                                           



Compatibility

No compatibility issues yet.


Credits and Thanks


       
  • DoubleX(Optional)




Author's Notes

 *----------------------------------------------------------------------------
*    # Terms Of Use                                                         
*      1. Commercial use's always allowed and crediting me's always optional.
*      2. You shall keep this plugin's Plugin Info part's contents intact.   
*      3. You shalln't claim that this plugin's written by anyone other than
*         DoubleX or my aliases. I always reserve the right to deny you from
*         using any of my plugins anymore if you've violated this.           
*      4. CC BY 4.0, except those conflicting with any of the above, applies
*         to this plugin, unless you've my permissions not needing follow so.
*      5. I always reserve the right to deny you from using this plugin     
*         anymore if you've violated any of the above.                       
*----------------------------------------------------------------------------
*    # Prerequisites                                                         
*      Abilities:                                                           
*      1. Nothing special for most ordinary cases                           
*      2. Little RMMV plugin development proficiency for more advanced uses 
*      3. Some RMMV plugin development proficiency to fully utilize this     
*----------------------------------------------------------------------------
*    # Author Notes                                                         
*      1. DoubleX RMMV Skill Hotkeys aims to give extreme control and freedom
*         to users by making it as flexible as I can with as little damage to
*         user-friendliness as I can                                         
*----------------------------------------------------------------------------
29
New Projects / [HTML5]Chrome Open Source Minesweeper
August 28, 2017, 11:23:35 am
The video can be found here:
https://www.youtube.com/watch?v=l4AI7Xyw4kE

I used roughly 9 weeks to come up with this HTML5 Chrome Open Source Minesweeper on my own from scratch, even though it's still somehow incomplete.

The github repository can be found here:
https://github.com/Double-X/HTML5-Chrome-Open-Source-Minesweeper
30
RMMV Script Database / [MV] DoubleX RMMV Status Bars
August 12, 2017, 11:18:44 am
DoubleX RMMV Status Bars
Authors: DoubleX
Version: v1.01a
Type: Status Bars Add-on
Key Term: Battle Add-on



Introduction

Lets you use bars to show battler statuses on their sprites


Features


       
  • The whole plugin can be disabled/enabled for the next battles

  •    
  • Uses Actor/Class/Weapon/Armor/Enemy/State notetags

  •    
  • Includes bars for HP, MP, TP and possibly more

  •    
  • Provides extreme control and freedom to those having at least a basic knowledge of what the RMMV codebase does by letting them use Javascript directly




Video

DoubleX RMMV Status Bars v1.01a+


Script

DoubleX RMMV Status Bars
Spoiler: ShowHide

/*============================================================================
*    ## Plugin Info                                                         
*----------------------------------------------------------------------------
*    # Plugin Name                                                           
*      DoubleX RMMV Status Bars                                             
*----------------------------------------------------------------------------
*    # Terms Of Use                                                         
*      1. Commercial use's always allowed and crediting me's always optional.
*      2. You shall keep this plugin's Plugin Info part's contents intact.   
*      3. You shalln't claim that this plugin's written by anyone other than
*         DoubleX or my aliases. I always reserve the right to deny you from
*         using any of my plugins anymore if you've violated this.           
*      4. CC BY 4.0, except those conflicting with any of the above, applies
*         to this plugin, unless you've my permissions not needing follow so.
*      5. I always reserve the right to deny you from using this plugin     
*         anymore if you've violated any of the above.                       
*----------------------------------------------------------------------------
*    # Prerequisites                                                         
*      Abilities:                                                           
*      1. Nothing special for most rudimetary use cases                     
*      2. Little RMMV plugin development proficiency for most ordinary uses 
*      3. Some RMMV plugin development proficiency to fully utilize this     
*----------------------------------------------------------------------------
*    # Links                                                                 
*      This plugin:                                                         
*      1. [url]http://pastebin.com/5BMvWPbu[/url]                                       
*      Video:                                                               
*      1. [url]https://www.youtube.com/watch?v=kaGhzueQwUs[/url]                       
*----------------------------------------------------------------------------
*    # Author                                                               
*      DoubleX                                                               
*----------------------------------------------------------------------------
*    # Changelog                                                             
*      v1.01a(GMT 1400 12-8-2017):                                           
*      1. Lets you set the status bars to show the stat change processes via
*         showProc, procUpdateRate, procColor1 and procColor2 in SBX         
*      2. Fixed crashes for status bars having the same minimum and maximum 
*      v1.00a(GMT 1700 16-9-2016):                                           
*      1. 1st version of this plugin finished                               
*============================================================================*/
/*:
* @plugindesc Lets you use bars to show battler statuses on their sprites
* @author DoubleX
*
* @param isEnabled
* @desc Sets whether this plugin will be enabled
*       It'll be stored as a boolean, and will be regarded as true if and only
*       if it's true
*       Don't change this during the same battle unless you really know what
*       you're truly foing
*       E.g.: Setting isEnabled as false will disable this plugin
* @default true
*
* @help
* You're supposed to open this plugin js file to edit its configurations
* The default plugin file name is DoubleX RMMV Status Bars v101a
* If you want to change that, you must edit the value of
* DoubleX_RMMV.Status_Bars_File, which must be done via opening this plugin
* js file directly
*============================================================================
*    ## Notetag Info                                                         
*----------------------------------------------------------------------------
*    # Actor/Class/Weapon/Armor/Enemy/State Notetags:                       
*      State notetags take the highest priority, followed by enemy, weapon, 
*      armor, class and actor                                               
*      1. <status status bar: SBX>                                           
*         - Sets the battler to setup a status bar of status using           
*           configurations set in function name SBX, which can only be edited
*           in this plugin js file directly                                 
*         - status must be included in STATUSES, which can only be edited in
*           this plugin js file directly                                     
*         - E.g.:                                                           
*           <hp status bar: HP> will set the battler to setup a hp status bar
*           using configurations set in HP, which can only be edited in this
*           plugin js file directly                                         
*         - Only the 1st effective notetag among all having the same status 
*           will be used(Reference tag: NOTETAG_MONO)                       
*============================================================================
*    ## Plugin Call Info                                                     
*----------------------------------------------------------------------------
*    # Configuration manipulations                                           
*      1. $gameSystem.statusBars.param                                       
*         - Returns the stored value of param listed in the plugin manager   
*         - E.g.:                                                           
*           $gameSystem.statusBars.isEnabled will return a Boolean indicating
*           whether this plugin's enabled                                   
*      2. $gameSystem.statusBars.param = val                                 
*         - Sets the stored value of param listed in plugin manager as val   
*         - E.g.:                                                           
*           $gameSystem.statusBars.isEnabled = false will set the stored     
*           value of parameter isEnabled shown on the plugin manager as false
*         - All $gameSystem.statusBars.param changes will be saved           
*    # Actor/Class/Weapon/Armor/Enemy/State notetag manipulations           
*      1. meta.statusBars[status]                                           
*         - Returns the function name SBX for String status specified in     
*           <status status bar: SBX> if there's any                         
*         - E.g.:                                                           
*           $dataStates[1].meta.statusBars[hp] will return the function SBX 
*           specified in <hp status bar: SBX> notetag of state with id 1     
*      2. meta.statusBars[status] = SBX                                     
*         - Sets the String status in <status status bar: SBX> notetag to use
*           the function with name SBX which is a String                     
*         - E.g.:                                                           
*           $dataEnemies[2].meta.statusBars['mp'] = 'MP' will set the SBX   
*           specified in <mp status bar: SBX> notetag of enemy with id 2 as 
*           MP                                                               
*         - All meta.statusBars changes can be saved if                     
*           DoubleX RMMV Dynamic Data is used                               
*    # Battler manipulations                                                 
*      1. isStatusBarChanged[status] = true                                 
*         - Notifys the status status bar of the battler to use a new       
*           configuration object                                             
*         - It'll be reset as false once a new configuration object's used   
*         - E.g.:                                                           
*           $gameParty.aliveMembers()[0].isStatusBarChanged['tp'] = true will
*           notify the tp status bar of the battler to use a new             
*           configuration object                                             
*    # Status bar manipulations                                             
*      1. new Window_Status_Bar(battler, status)                             
*         - Creates a new status bar showing the status status of battler   
*           battler                                                         
*         - E.g.:                                                           
*           new Window_Status_Bar($gameTroop.aliveMembers()[0], 'hp') will   
*           create a new status bar showing the hp status of the 1st troop   
*           member                                                           
*============================================================================
*/

var DoubleX_RMMV = DoubleX_RMMV || {};
DoubleX_RMMV['Status Bars'] = 'v1.01a';

// The plugin file name must be the same as DoubleX_RMMV.Status_Bars_File
DoubleX_RMMV.Status_Bars_File = 'DoubleX RMMV Status Bars v101a';

/*============================================================================
*    ## Plugin Configurations                                               
*       You only need to edit this part as it's about what this plugin does 
*----------------------------------------------------------------------------*/

DoubleX_RMMV.Status_Bars = {

    /* Setups the list of statuses that can have their status bars drawn
     * Each status must be represented by the name of its battler getter
     */
    STATUSES: [
        'hp',
        'mp',
        'tp'
    ],

    /*------------------------------------------------------------------------
     *    Status Bar Functions                                               
     *    - Setups SBX used by <status bar: SBX>                             
     *------------------------------------------------------------------------*/
    /* SBX are used by Window_Status_Bar at this._cfg = SB[this._cfgName](); in
     * _updateCfg
     * SBX are Javascript functions which must return an Object having at least
     * the following:
     * {
     *     visible: function(battler), // Hotspot
     *     opacity: function(battler), // Hotspot
     *     backColor: function(battler), // Hotspot
     *     color1: function(battler), // Hotspot
     *     color2: function(battler), // Hotspot
     *     x: function(battler), // Hotspot
     *     y: function(battler), // Hotspot
     *     w: function(battler), // Hotspot
     *     h, function(battler), // Hotspot
     *     text, function(battler), // Hotspot
     *     textX: function(battler), // Hotspot
     *     textY: function(battler), // Hotspot
     *     textSize: function(battler), // Hotspot
     *     textColor: function(battler), // Hotspot
     *     min: function(battler), // Hotspot
     *     max: function(battler), // Hotspot
     *     (v1.01a+)showProc: function(battler), // Hotspot
     *     (v1.01a+)procUpdateRate: function(battler) // Hotspot
     * }
     * All functions will be bound to the Window_Status_Bar upon its creation
     * and must take the battler and database item using the SBX as their
     * arguments
     *
     * Status bar configuration functions:
     * The function result of visible, which is the status bar visibility, will
     * be interpreted as truthy or falsy only
     * The function of opacity, which is the status bar opacity, must return a
     * Number between 0 and 255
     * The functions of backColor, color1 and color2, which are the status bar
     * back, 1st and 2nd colors respectively, must return a Number between
     * #00000000 and #FFFFFFFF
     * The functions of x and y, which are the status bar x and y offsets from
     * the battler sprites respectively, must return a Number
     * The functions of w and h, which are the status bar width and height
     * respectively, must return a positive Number
     * The function of text, which is the status bar description text, must
     * return a String
     * The functions of textX, textY and textSize, which are the status bar
     * description text x and y offset from the status bar, and size
     * respectively, must return a positive Number
     * The functions of min and max, which are the minimum and maximum value of
     * the status respiectively, must return a Number that must be not greater
     * than and not less than all the possible values of the current value
     * respectively
     * (v1.01a+)The functions of showProc, which is whether the stat change
     * processes will be shown on the status bars, will be interpreted as truthy
     * or falsy only
     * (v1.01a+)The functions of procUpdateRate, which is the rate relative to
     * the max length of the stat bar per second, must return a Number between 0
     * and 1
     * (v1.01a+)The functions of procColor1 and procColor2, which are the status
     * bar 1st and 2nd stat change colors respectively, must return a Number
     * between #00000000 and #FFFFFFFF
     *
     * SBX names can only use alphanumeric characters
     * The below SBX are examples added to help you set your SBX
     * You can freely use, rewrite and/or delete these examples
     *
     * Advanced:
     * The status bar prototype's inherited from Window_Base.prototype
     * All status bar configuration functions are used by Window_Status_Bar
     * visible and opacity are used in _updateBarVisibility
     * backColor, color1, color2, textColor, text, textX and textY are used in
     * _updateSetting
     * x, y, w and h are used in initialize
     * x is also used in _updateX
     * y is also used in _updateY
     * w is also used in _updateW
     * h is also used in _updateH
     * min and max are used in _updateFillW
     * (v1.01a+)showProc
     */

    // Sets the status bar to display the battler's hp statuses
    HP: function() { // v1.00a - v1.01a; Potential Hotspot
        return {
            // Sets the hp bar to be always visible only for alive battlers
            visible: function(battler) { return battler.isAlive(); }, // Hotspot
            // Sets the hp bar opacity to be always 255
            opacity: function(battler) { return 255; }, // Hotspot
            // Sets the hp bar color 1 to be always text color 15
            backColor: function(battler) { // Hotspot
                return this.textColor(15);
            },
            // Sets the hp bar color 1 to be always text color 20
            color1: function(battler) { return this.textColor(20); }, // Hotspot
            // Sets the hp bar color 2 to be always text color 21
            color2: function(battler) { return this.textColor(21); }, // Hotspot
            // Sets the hp bar x offset from battler sprite to be always 0
            x: function(battler) { return 0; }, // Hotspot
            // Sets the hp bar y offset from battler sprite to be always 16
            y: function(battler) { return 16; }, // Hotspot
            // Sets the hp bar width to be always 87
            w: function(battler) { return 87; }, // Hotspot
            // Sets the hp bar height to be always 16
            h: function(battler) { return 16; }, // Hotspot
            // Sets the hp bar description text to be always hp/mhp
            text: function(battler) { // Hotspot
                return battler.hp.toString() + '/' + battler.mhp.toString();
            },
            // Sets the hp bar description text size to be always 0
            textX: function(battler) { return 0; }, // Hotspot
            // Sets the hp bar description text size to be always 0
            textY: function(battler) { return 0; }, // Hotspot
            // Sets the hp bar description text size to be always 13
            textSize: function(battler) { return 13; }, // Hotspot
            // Sets hp bar description text color to be always text color 0
            textColor: function(battler) { // Hotspot
                return this.textColor(0);
            },
            // Sets the minimum hp to be shown on the hp bar to be always 0
            min: function(battler) { return 0; }, // Hotspot
            // Sets the maximum hp to be shown on the hp bar to be always mhp
            max: function(battler) { return battler.mhp; }, // Hotspot
            // (v1.01a+)Sets the hp change processes to be always shown
            showProc: function(battler) { return true; }, // Hotspot
            // (v1.01a+)Sets the hp change processes rate to be 100% of the
            // max length of the hp bar per second
            procUpdateRate: function(battler) { return 0.2; }, // Hotspot
            // Sets the hp change process color 1 to be always text color 6
            procColor1: function(battler) { return this.textColor(6); },
            // Hotspot
            // Sets the hp change process color 2 to be always text color 17
            procColor2: function(battler) { return this.textColor(17); }
            // Hotspot
        };
    },

    // Sets the status bar to display the battler's mp statuses
    MP: function() { // v1.00a - v1.01a; Potential Hotspot
        return {
           // Sets the mp bar to be always visible only for alive battlers
            visible: function(battler) { return battler.isAlive(); }, // Hotspot
            // Sets the mp bar opacity to be always 255
            opacity: function(battler) { return 255; }, // Hotspot
            // Sets the mp bar color 1 to be always text color 15
            backColor: function(battler) { // Hotspot
                return this.textColor(15);
            },
            // Sets the mp bar color 1 to be always text color 22
            color1: function(battler) { return this.textColor(22); }, // Hotspot
            // Sets the mp bar color 2 to be always text color 23
            color2: function(battler) { return this.textColor(23); }, // Hotspot
            // Sets the mp bar x offset from battler sprite to be always 0
            x: function(battler) { return 0; }, // Hotspot
            // Sets the mp bar y offset from battler sprite to be always 32
            y: function(battler) { return 32; }, // Hotspot
            // Sets the mp bar width to be always 87
            w: function(battler) { return 87; }, // Hotspot
            // Sets the mp bar height to be always 16
            h: function(battler) { return 16; }, // Hotspot
            // Sets the mp bar description text to be always mp/mmp
            text: function(battler) { // Hotspot
                return battler.mp.toString() + '/' + battler.mmp.toString();
            },
            // Sets the mp bar description text size to be always 0
            textX: function(battler) { return 0; }, // Hotspot
            // Sets the mp bar description text size to be always 0
            textY: function(battler) { return 0; }, // Hotspot
            // Sets the mp bar description text size to be always 13
            textSize: function(battler) { return 13; }, // Hotspot
            // Sets mp bar description text color to be always text color 0
            textColor: function(battler) { // Hotspot
                return this.textColor(0);
            },
            // Sets the minimum mp to be shown on the hp bar to be always 0
            min: function(battler) { return 0; }, // Hotspot
            // Sets the maximum mp to be shown on the hp bar to be always mmp
            max: function(battler) { return battler.mmp; }, // Hotspot
            // (v1.01a+)Sets the mp change processes to be always shown
            showProc: function(battler) { return true; }, // Hotspot
            // (v1.01a+)Sets the mp change processes rate to be 100% of the
            // max length of the mp bar per second
            procUpdateRate: function(battler) { return 0.2; }, // Hotspot
            // Sets the mp change process color 1 to be always text color 1
            procColor1: function(battler) { return this.textColor(1); },
            // Hotspot
            // Sets the mp change process color 2 to be always text color 4
            procColor2: function(battler) { return this.textColor(4); }
            // Hotspot
        };
    },

    // Sets the status bar to display the battler's tp statuses
    TP: function() { // v1.00a - v1.01a; Potential Hotspot
        return {
           // Sets the tp bar to be always visible
            visible: function(battler) { return battler.isAlive(); }, // Hotspot
            // Sets the tp bar opacity to be always 255
            opacity: function(battler) { return 255; }, // Hotspot
            // Sets the tp bar color 1 to be always text color 15
            backColor: function(battler) { // Hotspot
                return this.textColor(15);
            },
            // Sets the tp bar color 1 to be always text color 28
            color1: function(battler) { return this.textColor(28); }, // Hotspot
            // Sets the tp bar color 2 to be always text color 29
            color2: function(battler) { return this.textColor(29); }, // Hotspot
            // Sets the tp bar x offset from battler sprite to be always 0
            x: function(battler) { return 0; }, // Hotspot
            // Sets the tp bar y offset from battler sprite to be always 48
            y: function(battler) { return 48; }, // Hotspot
            // Sets the tp bar width to be always 87
            w: function(battler) { return 87; }, // Hotspot
            // Sets the tp bar height to be always 16
            h: function(battler) { return 16; }, // Hotspot
            // Sets the tp bar description text to be always tp/maxTp()
            text: function(battler) { // Hotspot
                return battler.tp.toString() + '/' + battler.maxTp().toString();
            },
            // Sets the tp bar description text size to be always 0
            textX: function(battler) { return 0; }, // Hotspot
            // Sets the tp bar description text size to be always 0
            textY: function(battler) { return 0; }, // Hotspot
            // Sets the tp bar description text size to be always 13
            textSize: function(battler) { return 13; }, // Hotspot
            // Sets tp bar description text color to be always text color 0
            textColor: function(battler) { // Hotspot
                return this.textColor(0);
            },
            // Sets the minimum tp to be shown on the hp bar to be always 0
            min: function(battler) { return 0; }, // Hotspot
            // Sets maximum tp to be shown on the hp bar to be always maxTp()
            max: function(battler) { return battler.maxTp(); }, // Hotspot
            // (v1.01a+)Sets the tp change processes to be always shown
            showProc: function(battler) { return true; }, // Hotspot
            // (v1.01a+)Sets the mp change processes rate to be 100% of the
            // max length of the mp bar per second
            procUpdateRate: function(battler) { return 0.2; }, // Hotspot
            // Sets the tp change process color 1 to be always text color 3
            procColor1: function(battler) { return this.textColor(3); },
            // Hotspot
            // Sets the tp change process color 2 to be always text color 24
            procColor2: function(battler) { return this.textColor(24); }
            // Hotspot
        };
    },

    // Adds new SBX here
   

}; // DoubleX_RMMV.Status_Bars

/*============================================================================
*    ## Plugin Implementations                                               
*       You need not edit this part as it's about how this plugin works     
*----------------------------------------------------------------------------
*    # Plugin Support Info:                                                 
*      1. Prerequisites                                                     
*         - Decent RMMV plugin development proficiency to fully comprehend   
*           this                                                             
*----------------------------------------------------------------------------*/

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

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

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

    /* Checks whether the passed configuration value's truthy or falsy
     * Functional cohesion/Data coupling/Referentially transperant
     * (String)param: The param to have its boolean value checked
     * Return: The boolean value of the param
     */
    Boolean: function(param) { return param === 'true'; }

}; // DoubleX_RMMV.Status_Bars_Params

function Window_Status_Bar() { this.initialize.apply(this, arguments); }

(function(SB) {

    'use strict';

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

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

    /* Reads all notetags of this plugin from the database
     * Return: True
     * Functional cohesion/Message coupling/Idempotent
     */
    DM._loadAllNotes = function() { // v1.00a - v1.00a; New
        // Ensures the notetags will only be read exactly once upon game start
        if (DoubleX_RMMV.Is_Status_Bar_Notes_Loaded) return true;
        var types = [$dataActors, $dataClasses, $dataWeapons, $dataArmors];
        types.concat([$dataEnemies, $dataStates]).forEach(function(type) {
            type.forEach(function(data) { if (data) DM._loadNotes(data); });
        });
        DoubleX_RMMV.Is_Status_Bar_Notes_Loaded = true;
        //
        return true;
    }; // DM._loadAllNotes

    /* Reads all notetags of this plugin from a dataum of the database
     * (Object)datum: The datum to have its notetags of this plugin read
     * Functional cohesion/Data coupling/Idempotent
     */
    DM._loadNotes = function(datum) { // v1.00a - v1.00a; New
        var statusBars = datum.meta.statusBars = {}; // Plugin call
        var regExp = /< *(\w+) +status +bar *: *(\w+) *>/i, status;
        // Refer to reference tag NOTETAG_MONO
        datum.note.split(/[\r\n]+/).forEach(function(line) {
            if (!line.match(regExp)) return;
            status = RegExp.$1;
            statusBars[status] = statusBars[status] || RegExp.$2;
        });
        //
    }; // DM._loadNotes

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

    /*------------------------------------------------------------------------
     *    New public instance variable                                       
     *------------------------------------------------------------------------*/
    // (Plugin call)The container of all parameters shown on the plugin manger
    Object.defineProperty(Game_System.prototype, "statusBars", {
        get: function() { /* Hotspot */ return this._statusBars; },
        configurable: true
    });

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

    /* Initializes all parameters of this plugin shown on the plugin manager
     * Functional cohesion/Message coupling/Idempotent
     */
    GS._initializeStatusBars = function() { // v1.00a - v1.00a; New
        this._statusBars = {};
        var params = PluginManager.parameters(DoubleX_RMMV.Status_Bars_File);
        var SBP = DoubleX_RMMV.Status_Bars_Params;
        // Lets parameters to use their strategies to have their desired formats
        Object.keys(params).forEach(function(param) {
            this._statusBars[param] = SBP[SBP[param]](params[param]);
        }, this);
        //
    }; // GS._initializeStatusBars

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

    /*------------------------------------------------------------------------
     *    New public instance variable                                       
     *------------------------------------------------------------------------*/
    // (Plugin call only)Container of all status bar change notification flags
    Object.defineProperty(Game_BattlerBase.prototype, "isStatusBarChanged", {
        get: function() { /* Hotspot */ return this._isStatusBarChanged; },
        configurable: true
    });

    /*------------------------------------------------------------------------
     *    New private instance variable                                       
     *------------------------------------------------------------------------*/
    // _statusBars: The container of all status bar configurations

    GBB.initMembers = Game_BattlerBase.prototype.initMembers;
    Game_BattlerBase.prototype.initMembers = function() {
    // v1.00a - v1.00a; Extended
        GBB._initStatusBarChanges.call(this); // Added
        GBB.initMembers.apply(this, arguments);
    }; // Game_BattlerBase.prototype.initMembers

    GBB.refresh = Game_BattlerBase.prototype.refresh;
    Game_BattlerBase.prototype.refresh = function() {
    // v1.00a - v1.00a; Extended
        GBB.refresh.apply(this, arguments);
        // Added to notify that the status bar configurations might be changed
        if (!$gameSystem.statusBars.isEnabled) return;
        GBB._notifyStatusBarChanges.call(this);
        //
    }; // Game_BattlerBase.prototype.refresh

    /* Setups the change notification flags of all statuses for this battler
     * Functional cohesion/Message coupling/Idempotent
     */
    GBB._initStatusBarChanges = function() { // v1.00a - v1.00a; New
        this._statusBars = {};
        this._isStatusBarChanged = {};
        SB.STATUSES.forEach(function(status) {
            this._isStatusBarChanged[status] = true;
        }, this);
    }; // GBB._initStatusBarChanges

    /* Marks that a new status bar configuration might need to be used
     * Functional cohesion/Message coupling/Idempotent
     */
    GBB._notifyStatusBarChanges = function() { // v1.00a - v1.00a; New
        // Raises the change notification flags of all statuses for this battler
        Object.keys(this._isStatusBarChanged).forEach(function(status) {
            this._isStatusBarChanged[status] = true;
        }, this);
        //
    }; // GBB._notifyStatusBarChanges

    /* Returns the latest status bar configuration object for the given status
     * Sequential cohesion/Data coupling/Idempotent
     * (String)status: The battler status shown by the status bar
     * Return(Object): The status bar configuration object for the given status
     */
    GBB.statusBarCfg = function(status) { // v1.00a - v1.00a; New; Hotspot
        // Setups a new status bar configuration only when it might be needed
        if (!this._statusBars[status] || this._isStatusBarChanged[status]) {
            this._isStatusBarChanged[status] = false;
            this._statusBars[status] = GBB._newStatusBarCfg.call(this, status);
        }
        //
        return this._statusBars[status];
    }; // GBB.statusBarCfg

    /* Returns a new status bar configuration object for the given status
     * Functional cohesion/Data coupling/Referentially transperant
     * (String)status: The battler status shown by the status bar
     * Return(Object): A new status bar configuration object for the status
     */
    GBB._newStatusBarCfg = function(status) {
    // v1.00a - v1.00a; New; Potential Hotspot
        // Refer to reference tag NOTETAG_MONO
        var datum = this._statusBarData().filter(function(data) {
            return data.meta.statusBars[status];
        })[0];
        return datum ? datum.meta.statusBars[status] : '';
        //
    }; // GBB._newStatusBarCfg

    /* Returns all database items that might have status bar configuration notes
     * Functional cohesion/Message coupling/Referentially transperant
     * Return(Array): An array of database item used by this battler
     */
    GBB._statusBarData = function() { // v1.00a - v1.00a; New; Potential Hotspot
        return this.states(); // Game_BattlerBase is abstract so GBB can be used
    }; // GBB._statusBarData

    /* Returns all database items that might have status bar configuration notes
     * Functional cohesion/Message coupling/Referentially transperant
     * Return(Array): An array of database item used by this actor
     */
    Game_Actor.prototype._statusBarData = function() {
    // v1.00a - v1.00a; New; Potential Hotspot
        // Use polymorphism at the cost of not using GA
        var data = GBB._statusBarData.call(this);
        data.concat(this.equips().filter(function(equip) { return equip; }));
        data.push(this.currentClass());
        data.push(this.actor());
        return data;
        //
    }; // Game_Actor.prototype._statusBarData

    /* Returns all database items that might have status bar configuration notes
     * Functional cohesion/Message coupling/Referentially transperant
     * Return(Array): An array of database item used by this enemy
     */
    Game_Enemy.prototype._statusBarData = function() {
    // v1.00a - v1.00a; New; Potential Hotspot
        // Use polymorphism at the cost of not using GE
        var data = GBB._statusBarData.call(this);
        data.push(this.enemy());
        return data;
        //
    }; // Game_Enemy.prototype._statusBarData

    SB.Sprite_Battler = {};
    var SBSB = SB.Sprite_Battler;

    /*------------------------------------------------------------------------
     *    New private instance variable                                     
     *------------------------------------------------------------------------*/
    // _statusBars: The container of all status bars for the battler

    SBSB.setBattler = Sprite_Battler.prototype.setBattler;
    Sprite_Battler.prototype.setBattler = function(battler) {
    // 1.00a - v1.00a; Extended; Hotspot
        // Added to reconfigure the status bars upon battler change
        var change = battler !== this._battler;
        //
        SBSB.setBattler.apply(this, arguments);
        // Added
        if (!$gameSystem.statusBars.isEnabled || !battler || !change) return;
        if (!this._statusBars) return SBSB._initStatusBars.call(this);
        SBSB._setStatusBarBattlers.call(this);
        //
    }; // Sprite_Battler.prototype.setBattler

    /* Setups all status bars for this battler
     * Functional cohesion/Message coupling/Idempotent
     */
    SBSB._initStatusBars = function() { // v1.00a - v1.00a; New
        this._statusBars = {};
        SB.STATUSES.forEach(function(status) {
            this._statusBars[status] =
            new Window_Status_Bar(this._battler, status);
            this.addChild(this._statusBars[status]);
        }, this);
    }; // SBSB._initStatusBars

    /* Updates the owner info stored in all status bars
     * Functional cohesion/Message coupling/Idempotent
     */
    SBSB._setStatusBarBattlers = function() { // v1.00a - v1.00a; New
        SB.STATUSES.forEach(function(status) {
            this._statusBars[status].battler = this._battler;
        }, this);
    }; // SBSB._setStatusBarBattlers

    /*------------------------------------------------------------------------
     *    # New class: Window_Status_Bar                                     
     *------------------------------------------------------------------------*/

    Window_Status_Bar.prototype = Object.create(Window_Base.prototype);
    Window_Status_Bar.prototype.constructor = Window_Status_Bar;

    /*------------------------------------------------------------------------
     *    New public instance variable                                       
     *------------------------------------------------------------------------*/
    // battler: The battler owning this status bar
    Object.defineProperty(Window_Status_Bar.prototype, "battler", {
        set: function() { /* Hotspot */ return this._battler; },
        configurable: true
    });

    /*------------------------------------------------------------------------
     *    New private instance variables                                     
     *------------------------------------------------------------------------*/
    /* _backColor: The back color of this status bar
     * _cfgName: The name of the configuration object used by this status bar
     * _cfg: The configuration object used by this status bar
     * _color1: The 1st color of this status bar
     * _color2: The 2nd color of this status bar
     * _fillW: The width of the filled portion of the status bar
     * _isRedraw: The flag indicating whether the status bar needs to be redrawn
     * (v1.01a+)_procFillW: The width of the stat change process bar
     * _status: The battler status shown by this status bar
     * _text: The status bar description text
     * _textColor: The color of the status bar description text
     * _textX: The x offset of the status bar description text from this bar
     * _textY: The y offset of the status bar description text from this bar
     */

    Window_Status_Bar.prototype.initialize = function(battler, status) {
    // v1.00a - v1.00a
        this._battler = battler;
        this._status = status;
        this._updateCfg(battler, status);
        if (this._cfg) {
            Window_Base.prototype.initialize.call(this, this._cfg.x(battler),
            this._cfg.y(battler), this._cfg.w(battler), this._cfg.h(battler));
        } else {
           Window_Base.prototype.initialize.call(this, 0, 0, 0, 0);
        }
       this.opacity = 0; // Only the status bar needs to be shown
    }; // Window_Status_Bar.prototype.initialize

    Window_Status_Bar.prototype.standardFontSize = function() {
    // v1.00a - v1.00a; Hotspot
        if (this._cfg) return this._cfg.textSize(this._battler);
        return Window_Base.prototype.standardFontSize.call(this);
    }; // Window_Status_Bar.prototype.standardFontSize

    Window_Status_Bar.prototype.standardPadding = function() {
    // v1.00a - v1.00a; Hotspot
        // The whole window is just the statu bar
        return this._cfg ? 0 : Window_Base.prototype.standardPadding.call(this);
        //
    }; // Window_Status_Bar.prototype.standardPadding

    Window_Status_Bar.prototype.resetFontSettings = function() {
    // v1.00a - v1.00a; Hotspot
        if (this.contents.fontSize === this.standardFontSize()) return;
        Window_Base.prototype.resetFontSettings.call(this);
        this._isRedraw = true;
    }; // Window_Status_Bar.prototype.resetFontSettings

    Window_Status_Bar.prototype.update = function() {
    // v1.00a - v1.00a; Hotspot
        Window_Base.prototype.update.call(this);
        this._updateBarStatuses(this._battler);
    }; // Window_Status_Bar.prototype.update

    /* Updates all statuses of this status bar
     * Sequential cohesion/Data coupling
     * (Game_Battler)battler: The battler owning this bar
     */
    Window_Status_Bar.prototype._updateBarStatuses = function(battler) {
    // v1.00a - v1.00a; Hotspot
        if (!battler) return this.visible = false;
        this._updateCfg(battler, this._status);
        this._updateBarVisibility(battler, this._cfg);
        if (!this.visible || this.contentsOpacity <= 0) return;
        this._updateDimensions(battler, this._cfg, this._status);
        if (!this.visible) return;
        this._updateColorText(battler, this._cfg);
        if (!this.visible || !this._isRedraw) return;
        this._isRedraw = false;
        this._redraw(battler, this._cfg);
    }; // Window_Status_Bar.prototype._updateBarStatuses

    /* Updates all configurations used by this status bar
     * Functional cohesion/Data coupling
     * (Game_Battler)battler: The battler owning this bar
     * (String)status: The battler status shown by this status bar
     */
    Window_Status_Bar.prototype._updateCfg = function(battler, status) {
    // v1.00a - v1.00a; Hotspot
        if (!battler) return;
        var lastCfgName = this._cfgName;
        this._cfgName = GBB.statusBarCfg.call(battler, status);
        if (lastCfgName === this._cfgName) return;
        if (this._cfgName.length <= 0) return this._cfg = null;
        this._cfg = SB[this._cfgName]();
        Object.keys(this._cfg).forEach(function(cfg) {
            this._cfg[cfg] = this._cfg[cfg].bind(this);
        }, this);
    }; // Window_Status_Bar.prototype._updateCfg

    /* Updates all visibility settings used by this status bar
     * Functional cohesion/Data coupling
     * (Game_Battler)battler: The battler owning this bar
     * (Object)cfg: The configuration object used by this status bar
     */
    Window_Status_Bar.prototype._updateBarVisibility = function(battler, cfg) {
    // v1.00a - v1.00a; Hotspot
        this.visible = this.visible && battler && cfg && cfg.visible(battler);
        if (this.visible) this.contentsOpacity = cfg.opacity(battler);
    }; // Window_Status_Bar.prototype._updateBarVisibility

    /* Updates all dimensional settings of this status bar
     * Sequential cohesion/Data coupling
     * (Game_Battler)battler: The battler owning this bar
     * (Object)cfg: The configuration object used by this status bar
     * (String)status: The battler status shown by this status bar
     */
    Window_Status_Bar.prototype._updateDimensions =
    function(battler, cfg, status) {
    // v1.00a - v1.00a; Hotspot
        this._updateW(battler, cfg);
        this.visible = this.visible && this.width > 0;
        if (!this.visible) return;
        this._updateH(battler, cfg);
        this.visible = this.visible && this.height > 0;
        if (!this.visible) return;
        this._updateX(battler, cfg);
        this._updateY(battler, cfg);
        this._updateFillW(battler, cfg, status);
    }; // Window_Status_Bar.prototype.updateDimensions

    /* Updates the width of this status bar and the redraw flag
     * Sequential cohesion/Data coupling
     * (Game_Battler)battler: The battler owning this bar
     * (Object)cfg: The configuration object used by this status bar
     */
    Window_Status_Bar.prototype._updateW = function(battler, cfg) {
    // v1.00a - v1.00a; Hotspot
        var newW = battler && cfg ? cfg.w(battler) : 0;
        if (this.width === newW) return;
        this.width = newW;
        this._isRedraw = true;
    }; // Window_Status_Bar.prototype._updateW

    /* Updates the height of this status bar and the redraw flag
     * Sequential cohesion/Data coupling
     * (Game_Battler)battler: The battler owning this bar
     * (Object)cfg: The configuration object used by this status bar
     */
    Window_Status_Bar.prototype._updateH = function(battler, cfg) {
    // v1.00a - v1.00a; Hotspot
        var newH = battler && cfg ? cfg.h(battler) : 0;
        if (this.height === newH) return;
        this.height = newH;
        this._isRedraw = true;
    }; // Window_Status_Bar.prototype._updateH

    /* Updates the x offset of this status bar from the battler sprite
     * Functional cohesion/Data coupling
     * (Game_Battler)battler: The battler owning this bar
     * (Object)cfg: The configuration object used by this status bar
     */
    Window_Status_Bar.prototype._updateX = function(battler, cfg) {
    // v1.00a - v1.00a; Hotspot
        if (!battler || !cfg) return;
        var newX = cfg.x(battler);
        if (this.x !== newX) this.x = newX;
    }; // Window_Status_Bar.prototype._updateX

    /* Updates the y offset of this status bar from the battler sprite
     * Functional cohesion/Data coupling
     * (Game_Battler)battler: The battler owning this bar
     * (Object)cfg: The configuration object used by this status bar
     */
    Window_Status_Bar.prototype._updateY = function(battler, cfg) {
    // v1.00a - v1.00a; Hotspot
        if (!battler || !cfg) return;
        var newY = cfg.y(battler);
        if (this.y !== newY) this.y = newY;
    }; // Window_Status_Bar.prototype._updateY

    /* Updates the fill width of this status bar and the redraw flag
     * Sequential cohesion/Data coupling
     * (Game_Battler)battler: The battler owning this bar
     * (Object)cfg: The configuration object used by this status bar
     * (String)status: The battler status shown by this status bar
     */
    Window_Status_Bar.prototype._updateFillW = function(battler, cfg, status) {
    // v1.00a - v1.01a; Hotspot
        var lastFillW = this._fillW;
        var statusRange = cfg.max(battler) - cfg.min(battler);
        this._fillW = battler && cfg && statusRange > 0 ?
                this.width * battler[status] / statusRange : 0;
        this._procFillW = this._procFillW || this._fillW;
        this._isRedraw = this._isRedraw || lastFillW !== this._fillW ||
                this._procFillW !== this._fillW;
    }; // Window_Status_Bar.prototype._updateFillW

    /* Updates all color and text settings of this status bar
     * Sequential cohesion/Data coupling
     * (Game_Battler)battler: The battler owning this bar
     * (Object)cfg: The configuration object used by this status bar
     */
    Window_Status_Bar.prototype._updateColorText = function(battler, cfg) {
    // v1.00a - v1.01a; Hotspot
        this._updateSetting(battler, cfg, 'backColor');
        this._updateSetting(battler, cfg, 'color1');
        this._updateSetting(battler, cfg, 'color2');
        this._updateSetting(battler, cfg, 'textColor');
        this._updateSetting(battler, cfg, 'text');
        this.visible = this.visible && !this._isTransperant();
        if (!this.visible) return;
        this._updateSetting(battler, cfg, 'textX');
        this._updateSetting(battler, cfg, 'textY');
        this._updateSetting(battler, cfg, 'procColor1');
        this._updateSetting(battler, cfg, 'procColor2');
    }; // Window_Status_Bar.prototype.updateDimensions

    /* Updates specified setting of this status bar that can change redraw flag
     * Sequential cohesion/Data coupling
     * (Game_Battler)battler: The battler owning this bar
     * (Object)cfg: The configuration object used by this status bar
     * (String)name: The setting name
     */
    Window_Status_Bar.prototype._updateSetting = function(battler, cfg, name) {
    // v1.00a - v1.00a; Hotspot
        if (!battler || !cfg) return;
        var _name = '_' + name, last = this[_name];
        this[_name] = cfg[name](battler);
        this._isRedraw = this._isRedraw || last !== this[_name];
    }; // Window_Status_Bar.prototype._updateSetting

    /* Checks if the whole status bar's transperant
     * Functional cohesion/Message coupling/Referentially transperant
     * Return(Boolean): Whether the whole status bar's transperant
     */
    Window_Status_Bar.prototype._isTransperant = function() {
    // v1.00a - v1.01a; Hotspot
        var opagueColor = 0x01000000;
        if (this._backColor >= opagueColor) return false;
        if (this._color1 >= opagueColor) return false;
        if (this._color2 >= opagueColor) return false;
        if (this._procColor1 >= opagueColor) return false;
        if (this._procColor2 >= opagueColor) return false;
        return this._textColor < opagueColor || this._text.length <= 0;
    }; // Window_Status_Bar.prototype._isTransperant

    /* Redraws the whole status bar
     * Functional cohesion/Message coupling
     */
    Window_Status_Bar.prototype._redraw = function() {
    // v1.00a - v1.01a; Hotspot
        if (this._cfg.showProc(this._battler)) return this._redrawWithProc();
        this._redrawWithoutProc();
    }; // Window_Status_Bar.prototype._redraw

    /* (v1.01a+)Redraws the whole status bar with the stat change process shown
     * Functional cohesion/Message coupling
     */
    Window_Status_Bar.prototype._redrawWithProc = function() {
    // v1.01a - v1.01a; Hotspot
        if (this._procFillW < this._fillW) return this._redrawWithProcAbove();
        if (this._procFillW > this._fillW) return this._redrawWithProcBelow();
        this._redrawWithoutProc();
    }; // Window_Status_Bar.prototype._redrawWithProc

    /* (v1.01a+)Redraws the whole status bar with the stat change process shown
     * Sequential cohesion/Message coupling
     */
    Window_Status_Bar.prototype._redrawWithProcAbove = function() {
    // v1.01a - v1.01a; Hotspot
        this._redrawBack();
        this.contents.gradientFillRect(0, 0, this._fillW, this.height,
                this._color1, this._color2);
        this.contents.gradientFillRect(0, 0, this._procFillW, this.height,
                this._procColor1, this._procColor2);
        this._redrawText();
        this._addProcFillW();
        // Otherwise the stat change process bar would show after it's done
        if (this._procFillW >= this._fillW) this._redrawWithoutProc();
        //
    }; // Window_Status_Bar.prototype._redrawWithProcAbove

    /* (v1.01a+)Increases the stat change process fill width in the stat bar
     * Functional cohesion/Message coupling
     */
    Window_Status_Bar.prototype._addProcFillW = function() {
    // v1.01a - v1.01a; Hotspot
        // Fps's assumed to be always 60
        this._procFillW = Math.min(this._procFillW + this._cfg.procUpdateRate(
                this._battler) * this.width / 60, this._fillW);
        //
    }; // Window_Status_Bar.prototype._addProcFillW

    /* (v1.01a+)Redraws the whole status bar with the stat change process shown
     * Sequential cohesion/Message coupling
     */
    Window_Status_Bar.prototype._redrawWithProcBelow = function() {
    // v1.01a - v1.01a; Hotspot
        this._redrawBack();
        this.contents.gradientFillRect(0, 0, this._procFillW, this.height,
                this._procColor1, this._procColor2);
        this.contents.gradientFillRect(0, 0, this._fillW, this.height,
                this._color1, this._color2);
        this._redrawText();
        this._minusProcFillW();
        // Otherwise the stat change process bar would show after it's done
        if (this._procFillW <= this._fillW) this._redrawWithoutProc();
        //
    }; // Window_Status_Bar.prototype._redrawWithProcBelow

    /* (v1.01a+)Decreases the stat change process fill width in the stat bar
     * Functional cohesion/Message coupling
     */
    Window_Status_Bar.prototype._minusProcFillW = function() {
    // v1.01a - v1.01a; Hotspot
        // Fps's assumed to be always 60
        this._procFillW = Math.max(this._procFillW - this._cfg.procUpdateRate(
                this._battler) * this.width / 60, this._fillW);
        //
    }; // Window_Status_Bar.prototype._addProcFillW

    /* Redraws the whole status bar without showing the stat change processes
     * Functional cohesion/Message coupling/Idempotent
     */
    Window_Status_Bar.prototype._redrawWithoutProc = function() {
    // v1.01a - v1.01a; Potential Hotspot
        this._redrawBack();
        this.contents.gradientFillRect(0, 0, this._fillW, this.height,
                this._color1, this._color2);
        this._redrawText();
    }; // Window_Status_Bar.prototype._redrawWithoutProc

    /* Redraws the whole status bar without showing the stat change processes
     * Functional cohesion/Message coupling/Idempotent
     */
    Window_Status_Bar.prototype._redrawBack = function() {
        this.contents.clear();
        this.contents.fillRect(0, 0, this.width, this.height, this._backColor);
    }; // Window_Status_Bar.prototype._redrawBack

    /* Redraws the whole status bar without showing the stat change processes
     * Functional cohesion/Message coupling/Idempotent
     */
    Window_Status_Bar.prototype._redrawText = function() {
    // v1.01a - v1.01a; Potential Hotspot
        this.changeTextColor(this._textColor);
        var text = this._text;
        this.contents.drawText(text, this._textX, this._textY,
           this.textWidth(text), this.height);
    }; // Window_Status_Bar.prototype._redrawText

})(DoubleX_RMMV.Status_Bars);

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



Instructions

You're supposed to open this plugin js file to edit its configurations
The default plugin file name is DoubleX RMMV Status Bars v101a
If you want to change that, you must edit the value of DoubleX_RMMV.Status_Bars_File, which must be done via opening this plugin js file directly


Compatibility

No compatibility issues yet.


Credits and Thanks


       
  • DoubleX(Optional)




Author's Notes


*----------------------------------------------------------------------------
*    # Terms Of Use                                                         
*      1. Commercial use's always allowed and crediting me's always optional.
*      2. You shall keep this plugin's Plugin Info part's contents intact.   
*      3. You shalln't claim that this plugin's written by anyone other than
*         DoubleX or my aliases. I always reserve the right to deny you from
*         using any of my plugins anymore if you've violated this.           
*      4. CC BY 4.0, except those conflicting with any of the above, applies
*         to this plugin, unless you've my permissions not needing follow so.
*      5. I always reserve the right to deny you from using this plugin     
*         anymore if you've violated any of the above.                       
*----------------------------------------------------------------------------
*    # Prerequisites                                                         
*      Abilities:                                                           
*      1. Nothing special for most rudimetary use cases                     
*      2. Little RMMV plugin development proficiency for most ordinary uses 
*      3. Some RMMV plugin development proficiency to fully utilize this     
*----------------------------------------------------------------------------