DOUBLEX RMMV SKILL PROGRESS

RPG Maker MV

Lets you to set some skills to progress to some other skills after gaining enough skill experience and meeting some prerequisites

  • DoubleX
  • 04/28/2020 12:11 PM
  • 1208 views
Note
This plugin's available for commercial use

Introduction
*    1. This plugin lets users to set some skills to progress to some other
 *       skills after gaining enough skill experience and meeting some
 *       prerequisites, like progressing from Fire I to Fire II when the
 *       actor's at least level 9 and gained 100 skill experience for Fire I
 *    2. Skill experience's gained from using that skill as well as hitting
 *       targets with that skill


Videos


Games using this plugin
None so far

Parameters
* @param isEnabled
 * @desc Sets whether this plugin will be enabled
 * It'll be the contents of a function returning a Boolean
 * @default return true;
 *
 * @param condNotePriority
 * @desc Sets the data type priority of cond notetags
 * It'll be the contents of a function returning an String Array
 * @default return ["states", "armors", "weapons", "currentClass", "actor"];
 *
 * @param condNoteChainingRule
 * @desc Sets how to use multiple cond notetags
 * It'll be the contents of a function returning a String
 * @default return "every";
 *
 * @param defaultMax
 * @desc Sets the default max experience before chaining max notetags
 * It'll be the contents of a function returning a positive Number
 * @default return 10;
 *
 * @param maxNotePriority
 * @desc Sets the data type priority of max notetags
 * It'll be the contents of a function returning a String Array
 * @default return ["states", "armors", "weapons", "currentClass", "actor"];
 *
 * @param maxNoteChainingRule
 * @desc Sets how to use multiple max notetags
 * It'll be the contents of a function returning a String
 * @default return "/";
 *
 * @param defaultUseGain
 * @desc Sets the default useGain before chaining useGain notetags
 * It'll be the contents of a function returning a Number
 * @default return 2;
 *
 * @param useGainNotePriority
 * @desc Sets the data type priority of useGain notetags
 * It'll be the contents of a function returning an String Array
 * @default return ["states", "armors", "weapons", "currentClass", "actor"];
 *
 * @param useGainNoteChainingRule
 * @desc Sets how to use multiple useGain notetags
 * It'll be the contents of a function returning a String
 * @default return "*";
 *
 * @param defaultHitGain
 * @desc Sets the default hitGain before chaining hitGain notetags
 * It'll be the contents of a function returning a Number
 * @default return 1;
 *
 * @param hitGainNotePriority
 * @desc Sets the data type priority of hitGain notetags
 * It'll be the contents of a function returning an String Array
 * @default return ["states", "armors", "weapons", "currentClass", "actor"];
 *
 * @param hitGainNoteChainingRule
 * @desc Sets how to use multiple hitGain notetags
 * It'll be the contents of a function returning a String
 * @default return "*";
 *
 * @param nextNotePriority
 * @desc Sets the data type priority of next notetags
 * It'll be the contents of a function returning an String Array
 * @default return ["actor", "currentClass"];
 *
 * @param nextNoteChainingRule
 * @desc Sets how to use multiple next notetags
 * It'll be the contents of a function returning a String
 * @default return "every";
 *
 * @param defaultKeepCurrent
 * @desc Set default keepCurrent before chaining keepCurrent notetags
 * It'll be the contents of a function returning a Boolean
 * @default return true;
 *
 * @param keepCurrentNotePriority
 * @desc Sets the data type priority of keepCurrent notetags
 * It'll be the contents of a function returning an String Array
 * @default return ["actor", "currentClass"];
 *
 * @param keepCurrentNoteChainingRule
 * @desc Sets how to use multiple keepCurrent notetags
 * It'll be the contents of a function returning a String
 * @default return "first";
 *
 * @param willEnd
 * @desc Sets what will happen right before progressing a skill
 * It'll be the contents of a function with its return value unused
 * @default
 *
 * @param willEndNotePriority
 * @desc Sets the data type priority of willEnd notetags
 * It'll be the contents of a function returning an String Array
 * @default return ["states", "armors", "weapons", "currentClass", "actor"];
 *
 * @param willEndNoteChainingRule
 * @desc Sets how to use multiple willEnd notetags
 * It'll be the contents of a function returning a String
 * @default return "every";
 *
 * @param didEnd
 * @desc Sets what will happen right after progressing a skill
 * It'll be the contents of a function with its return value unused
 * @default $gameTemp.reserveCommonEvent(1);
 *
 * @param didEndNotePriority
 * @desc Sets the data type priority of didEnd notetags
 * It'll be the contents of a function returning an String Array
 * @default return ["states", "armors", "weapons", "currentClass", "actor"];
 *
 * @param didEndNoteChainingRule
 * @desc Sets how to use multiple didEnd notetags
 * It'll be the contents of a function returning a String
 * @default return "every";
 *
 * @param cmdLineH
 * @desc Sets the skill progress command window line height
 * It'll be the contents of a function returning a Number
 * @default return Window_Command.prototype.lineHeight.call(this);
 *
 * @param cmdFontSize
 * @desc Sets the skill progress command window standard font size
 * It'll be the contents of a function returning a Number
 * @default return Window_Command.prototype.standardFontSize.call(this);
 *
 * @param cmdPadding
 * @desc Sets the skill progress command window standard padding
 * It'll be the contents of a function returning a Number
 * @default return Window_Command.prototype.standardPadding.call(this);
 *
 * @param cmdTextPadding
 * @desc Sets the skill progress command window text padding
 * It'll be the contents of a function returning a Number
 * @default return Window_Command.prototype.textPadding.call(this);
 *
 * @param cmdBackOpacity
 * @desc Sets the skill progress command window standard back opacity
 * It'll be the contents of a function returning a Number
 * @default return Window_Command.prototype.standardBackOpacity.call(this);
 *
 * @param cmdTranslucentOpacity
 * @desc Sets the skill progress command window translucent opacity
 * It'll be the contents of a function returning a Number
 * @default return Window_Command.prototype.translucentOpacity.call(this);
 *
 * @param cmdSpacing
 * @desc Sets the skill progress command window spacing
 * It'll be the contents of a function returning a Number
 * @default return Window_Command.prototype.spacing.call(this);
 *
 * @param cmdWinW
 * @desc Sets the skill progress command window width
 * It'll be the contents of a function returning a Number
 * @default return Window_Command.prototype.windowWidth.call(this);
 *
 * @param cmdWinH
 * @desc Sets the skill progress command window height
 * It'll be the contents of a function returning a Number
 * @default return Window_Command.prototype.windowHeight.call(this);
 *
 * @param cmdWinX
 * @desc Sets the skill progress command window x position
 * It'll be the contents of a function returning a Number
 * @default return 0;
 *
 * @param cmdWinY
 * @desc Sets the skill progress command window y position
 * It'll be the contents of a function returning a Number
 * @default return 0;
 *
 * @param cmdView
 * @desc Sets the skill progress command window view progress command text
 * It'll be the contents of a function returning a String
 * @default return "View Progress";
 *
 * @param cmdUse
 * @desc Sets the skill progress command window use skill command text
 * It'll be the contents of a function returning a String
 * @default return "Use";
 *
 * @param statLineH
 * @desc Sets the skill progress stat window line height
 * It'll be the contents of a function returning a Number
 * @default return Window_Selectable.prototype.lineHeight.call(this);
 *
 * @param statFontSize
 * @desc Sets the skill progress stat window standard font size
 * It'll be the contents of a function returning a Number
 * @default return Window_Selectable.prototype.standardFontSize.call(this);
 *
 * @param statPadding
 * @desc Sets the skill progress stat window standard padding
 * It'll be the contents of a function returning a Number
 * @default return Window_Selectable.prototype.standardPadding.call(this);
 *
 * @param statTextPadding
 * @desc Sets the skill progress stat window text padding
 * It'll be the contents of a function returning a Number
 * @default return Window_Selectable.prototype.textPadding.call(this);
 *
 * @param statBackOpacity
 * @desc Sets the skill progress stat window standard back opacity
 * It'll be the contents of a function returning a Number
 * @default return Window_Selectable.prototype.standardBackOpacity.call(this);
 *
 * @param statTranslucentOpacity
 * @desc Sets the skill progress stat window translucent opacity
 * It'll be the contents of a function returning a Number
 * @default return Window_Selectable.prototype.translucentOpacity.call(this);
 *
 * @param statSpacing
 * @desc Sets the skill progress stat window spacing
 * It'll be the contents of a function returning a Number
 * @default return Window_Selectable.prototype.spacing.call(this);
 *
 * @param statWinW
 * @desc Sets the skill progress stat window width
 * It'll be the contents of a function returning a Number
 * @default return Graphics.boxWidth;
 *
 * @param statWinH
 * @desc Sets the skill progress stat window height
 * It'll be the contents of a function returning a Number
 * @default return this.fittingHeight(2);
 *
 * @param statWinX
 * @desc Sets the skill progress stat window x position
 * It'll be the contents of a function returning a Number
 * @default return 0;
 *
 * @param statWinY
 * @desc Sets the skill progress stat window y position
 * It'll be the contents of a function returning a Number
 * @default return 0;
 *
 * @param condLineH
 * @desc Sets the skill progress condition window line height
 * It'll be the contents of a function returning a Number
 * @default return Window_Selectable.prototype.lineHeight.call(this);
 *
 * @param condFontSize
 * @desc Sets the skill progress condition window standard font size
 * It'll be the contents of a function returning a Number
 * @default return Window_Selectable.prototype.standardFontSize.call(this);
 *
 * @param condPadding
 * @desc Sets the skill progress condition window standard padding
 * It'll be the contents of a function returning a Number
 * @default return Window_Selectable.prototype.standardPadding.call(this);
 *
 * @param condTextPadding
 * @desc Sets the skill progress condition window text padding
 * It'll be the contents of a function returning a Number
 * @default return Window_Selectable.prototype.textPadding.call(this);
 *
 * @param condBackOpacity
 * @desc Sets the skill progress condition window standard back opacity
 * It'll be the contents of a function returning a Number
 * @default return Window_Selectable.prototype.standardBackOpacity.call(this);
 *
 * @param condTranslucentOpacity
 * @desc Sets the skill progress condition window translucent opacity
 * It'll be the contents of a function returning a Number
 * @default return Window_Selectable.prototype.translucentOpacity.call(this);
 *
 * @param condSpacing
 * @desc Sets the skill progress condition window spacing
 * It'll be the contents of a function returning a Number
 * @default return Window_Selectable.prototype.spacing.call(this);
 *
 * @param condWinW
 * @desc Sets the skill progress condition window width
 * It'll be the contents of a function returning a Number
 * @default return Graphics.boxWidth / 2;
 *
 * @param condWinH
 * @desc Sets the skill progress condition window height
 * It'll be the contents of a function returning a Number
 * @default return Graphics.boxHeight - this.fittingHeight(2);
 *
 * @param condWinX
 * @desc Sets the skill progress condition window x position
 * It'll be the contents of a function returning a Number
 * @default return 0;
 *
 * @param condWinY
 * @desc Sets the skill progress condition window y position
 * It'll be the contents of a function returning a Number
 * @default return this.fittingHeight(2);
 *
 * @param nextLineH
 * @desc Sets the skill progress next skill window line height
 * It'll be the contents of a function returning a Number
 * @default return Window_Selectable.prototype.lineHeight.call(this);
 *
 * @param nextFontSize
 * @desc Sets the skill progress next skill window standard font size
 * It'll be the contents of a function returning a Number
 * @default return Window_Selectable.prototype.standardFontSize.call(this);
 *
 * @param nextPadding
 * @desc Sets the skill progress next skill window standard padding
 * It'll be the contents of a function returning a Number
 * @default return Window_Selectable.prototype.standardPadding.call(this);
 *
 * @param nextTextPadding
 * @desc Sets the skill progress next skill window text padding
 * It'll be the contents of a function returning a Number
 * @default return Window_Selectable.prototype.textPadding.call(this);
 *
 * @param nextBackOpacity
 * @desc Sets the skill progress next skill window standard back opacity
 * It'll be the contents of a function returning a Number
 * @default return Window_Selectable.prototype.standardBackOpacity.call(this);
 *
 * @param nextTranslucentOpacity
 * @desc Sets the skill progress next skill window translucent opacity
 * It'll be the contents of a function returning a Number
 * @default return Window_Selectable.prototype.translucentOpacity.call(this);
 *
 * @param nextSpacing
 * @desc Sets the skill progress next skill window spacing
 * It'll be the contents of a function returning a Number
 * @default return Window_Selectable.prototype.spacing.call(this);
 *
 * @param nextWinW
 * @desc Sets the skill progress next skill window width
 * It'll be the contents of a function returning a Number
 * @default return Graphics.boxWidth / 2;
 *
 * @param nextWinH
 * @desc Sets the skill progress next skill window height
 * It'll be the contents of a function returning a Number
 * @default return Graphics.boxHeight - this.fittingHeight(2);
 *
 * @param nextWinX
 * @desc Sets the skill progress next skill window x position
 * It'll be the contents of a function returning a Number
 * @default return Graphics.boxWidth / 2;
 *
 * @param nextWinY
 * @desc Sets the skill progress next skill window y position
 * It'll be the contents of a function returning a Number
 * @default return this.fittingHeight(2);
 *
 * @param varIds
 * @desc Sets the list of ids of game variables used by this plugin
 * It'll be the contents of a function returning a Number Array
 * @default return [];
 *
 * @param switchIds
 * @desc Sets the list of ids of game switches used by this plugin
 * It'll be the contents of a function returning a Number Array
 * @default return [];


Notetags
*    # Actor/Class/Weapon/Armor/State/Skill Notetag contents:
 *      1. cond suffix1 suffix2: entry1, entry2
 *         - Sets a prerequisite to be met for the skill to be progressed with
 *           descriptions to be shown
 *         - suffix1 and suffix2 can be cfg, val, switch, var or script
 *         - (Advanced)Please refer to Cond Functions in the configuration
 *           region for using cfg or script suffixes
 *         - The result of entry1 can be anything as it's used as truthy/falsy
 *           to check whether the prerequisite's met
 *         - The result of entry2 can be any String as the condition
 *           descriptions
 *         - If the result of entry2 is falsy, the result of entry1 will also
 *           be treated as falsy
 *           (Reference tag: INVALID_COND_DESC)
 *         - If there's no such effective notetag, the skill involved won't
 *           progress
 *         - E.g.:
 *           <skill progress cond switch var: 1, 2> will set a prerequisite
 *           for the skill to be progressed as the value of the game switch
 *           with id 1, with descriptions to be shown as the value of the game
 *           variable with id 2, provided that that variable stores a String
 *      2. max suffix1: entry1
 *         - Sets the maximum experience of the skill to be progressed
 *         - suffix1 can be cfg, val, var or script
 *         - (Advanced)Please refer to Max Functions in the configuration
 *           region for using cfg or script suffixes, or the eval variant
 *         - The result of entry1 can be any positive Number as the maximum
 *           experience
 *         - Having an invalid result is the same as not meeting prerequisites
 *           (Reference tag: INVALID_MAX)
 *         - If the maximum experience of the skill to be progressed's reduced
 *           to become not greater than its current experience, the skill will
 *           be ended progressing immediately
 *           (Reference tag: REDUCED_MAX_END_SKILL_PROGRESS)
 *         - E.g.:
 *           <skill progress max var: 1> will set the maximum experience of
 *           the skill to be progressed as the value of the game variable with
 *           id 1
 *      3. useGain suffix1: entry1
 *         - Sets the experience gain of the skill to be progressed upon using
 *           it
 *         - suffix1 can be cfg, val, var or script
 *         - (Advanced)Please refer to useGain Functions in the configuration
 *           region for using cfg or script suffixes, or the eval variant
 *         - The result of entry1 can be any Number as the experience gain
 *         - All invalid results will be regarded as 0
 *           (Reference tag: INVALID_GAIN)
 *         - E.g.:
 *           If the game variable with id 1 is "return this.luk;", then
 *           <skill progress useGain script: 1> will set the experience gain
 *           of the skill to be progressed upon using it as the luk of the
 *           user at that moment
 *      4. hitGain suffix1: entry1
 *         - Sets the experience gain of the skill to be progressed when the
 *           skill hits a target
 *         - suffix1 can be cfg, val, var or script
 *         - (Advanced)Please refer to hitGain Functions in the configuration
 *           region for using cfg or script suffixes, or the eval variant
 *         - The result of entry1 can be any Number as the experience gain
 *         - All invalid results will be regarded as 0
 *           (Reference tag: INVALID_GAIN)
 *         - E.g.:
 *           If HG1 in the configuration region is "return this.level;", then
 *           <skill progress hitGain cfg: HG1> will set the experience gain
 *           of the skill to be progressed when the skill hits a target as the
 *           level of the user at that moment
 *      5. next suffix1: entry1
 *         - Sets the skill to learn upon ending progressing the current one
 *         - suffix1 can be cfg, val, var or script
 *         - (Advanced)Please refer to Next Functions in the configuration
 *           region for using cfg or script suffixes, or the eval variant
 *         - The result of entry1 can be an Array of any valid id of the skills
 *           to learn
 *         - If the val suffix's used, the skill ids should be concatenated
 *           with the underscore, like 4_5 being skills with id 4 and 5
 *           (Reference tag: NUMBER_ARRAY)
 *         - If the var suffix's used, the variable referred by the entry
 *           should have skill ids concatenated with the underscore, like 4_5
 *           being skills with id 4 and 5
 *           (Reference tag: NUMBER_ARRAY)
 *         - Having an invalid result is the same as not meeting prerequisites
 *           (Reference tag: INVALID_NEXT)
 *         - E.g.:
 *           <skill progress next val: 4_5> will set the skills to learn upon
 *           ending progressing the current one as those with id 4 and 5
 *      6. keepCurrent suffix1: entry1
 *         - Sets whether the current skill will be kept instead of forgotten
 *           when it ends progressing
 *         - suffix1 can be cfg, val, switch, var or script
 *         - (Advanced)Please refer to keepCurrent Functions in the
 *           configuration region for using cfg or script suffixes, or the
 *           eval variant
 *         - The result of entry1 can be anything as it's used as truthy/falsy
 *           to sets whether the current skill will be kept
 *         - E.g.:
 *           <skill progress keepCurrent>
 *           return false;
 *           </skill progress keepCurrent>
 *           will set the current skill to be forgotten
 *      7. willEnd suffix1: entry1
 *         - Runs extra events just before ending progressing the skill
 *         - suffix1 can be cfg, event or script
 *         - (Advanced)Please refer to willEnd Functions in the configuration
 *           region for using cfg or script suffixes, or the eval variant
 *         - The entry1 is supposed to cause something to happen instead of
 *           returning anything
 *         - The willEnd parameter counterpart will always be run first
 *           (Reference tag: RUN_DEFAULT_FIRST)
 *         - E.g.:
 *           <skill progress willEnd event: 1> will reserve the common event
 *           with id 1 just after ending progressing the skill
 *      8. didEnd suffix1: entry1
 *         - Runs extra events just after ending progressing the skill
 *         - suffix1 can be cfg, event or script
 *         - (Advanced)Please refer to didEnd Functions in the configuration
 *           region for using cfg or script suffixes, or the eval variant
 *         - The entry1 is supposed to cause something to happen instead of
 *           returning anythinganything
 *         - The didEnd parameter counterpart will always be run first
 *           (Reference tag: RUN_DEFAULT_FIRST)
 *         - E.g.:
 *           If DE1 in the configuration region is unchanged,
 *           <skill progress didEnd cfg: DE1> will close the actor window
 *           when the skill involved ended progressing outside battles
 *           (Please refer to DE1 for details)


Script Calls
*    # (Advanced)Configuration manipulations
 *      1. $gameSystem.skillProgress.params.param
 *         - Returns the stored value of param listed in the plugin manager or
 *           their configuration counterparts
 *         - E.g.:
 *           $gameSystem.skillProgress.params.isEnabled will return the
 *           contents of a function returning a Boolean indicating whether
 *           this plugin's enabled
 *      2. $gameSystem.skillProgress.params.param = funcContents
 *         - Sets the stored value of param listed in the plugin manager or
 *           their configuration counterpart as funcContents, which is the
 *           contents of a function
 *         - E.g.:
 *           $gameSystem.skillProgress.params.isEnabled = "return false;" will
 *           set the stored value of parameter isEnabled shown on the plugin
 *           manager or its configuration counterpart as "return false;",
 *           causing the corresponding function to always return false, thus
 *           always disabling this plugin
 *         - $gameSystem.skillProgress.params.param changes will be saved
 *         - DoubleX_RMMV.Skill_Progress.params.param = func, where func is
 *           the corresponding function having funcContents as its contents,
 *           should be explicitly called immediately afterwards
 *      3. $gameSystem.skillProgress.cfgs.cfg
 *         - Basically the same as $gameSystem.skillProgress.params.param,
 *           except that this script call applies to configurations found in
 *           the configuration region only
 *      4. $gameSystem.skillProgress.cfgs.cfg = funcContents
 *         - Basically the same as
 *           $gameSystem.skillProgress.params.param = funcContents, except that
 *           this script call applies to configurations found in the
 *           configuration region only
 *         - DoubleX_RMMV.Skill_Progress.cfgs.cfg = func, where func is the
 *           corresponding function having funcContents as its contents,
 *           should be explicitly called immediately afterwards
 *      5. $gameSystem.skillProgress.notes.note
 *         - Basically the same as $gameSystem.skillProgress.params.param,
 *           except that this script call applies to notetag values found in
 *           the configuration region
 *      6. $gameSystem.skillProgress.notes.note = funcContents
 *         - Basically the same as
 *           $gameSystem.skillProgress.params.param = funcContents, except
 *           that this script call applies to notetag values found in the
 *           configuration region
 *         - DoubleX_RMMV.Skill_Progress.notes.note = func, where func is the
 *           corresponding function having funcContents as its contents,
 *           should be explicitly called immediately afterwards
 *    # (Advanced)Actor/Class/Weapon/Armor/State/Skill notetag manipulations
 *      All meta.skillProgress changes can be saved if
 *      DoubleX RMMV Dynamic Data is used
 *      1. meta.skillProgress.note
 *         - note is either of the following:
 *           cond(corresponds to notetag content
 *                cond suffix1 suffix2: entry1, entry2)
 *           max(corresponds to notetag content max suffix1: entry1)
 *           useGain(corresponds to notetag content useGain suffix1: entry1)
 *           hitGain(corresponds to notetag content hitGain suffix1: entry1)
 *           next(corresponds to notetag content next suffix1: entry1)
 *           keepCurrent(corresponds to notetag content
 *                      keepCurrent suffix1: entry1)
 *           willEnd(corresponds to notetag content willEnd suffix1: entry1)
 *           didEnd(corresponds to notetag content didEnd suffix1: entry1)
 *         - Returns the Array of Objects in this form:
 *           { suffixi: suffixi, entryi: entryi }
 *           Which corresponds to <skill progress note suffixi: entryi>
 *         (Reference tag: MULTI_SUFFIX_ENTRY)
 *         - E.g.:
 *           $dataWeapons[3].meta.skillProgress.cond will return the Array of
 *           Object
 *           [{ suffix1: "switch", entry1: "1", suffix2: "var", entry2: "2" }]
 *           if the effective notetag of  weapon with id 3 is
 *           <skill progress cond switch var: 1, 2>
 *      2. meta.skillProgress.note = [{ suffixi: suffixi, entryi: entryi }]
 *         (Reference tag: MULTI_SUFFIX_ENTRY)
 *         - note is either of the following:
 *           cond(corresponds to notetag content
 *                cond suffix1 suffix2: entry1, entry2)
 *           max(corresponds to notetag content max suffix1: entry1)
 *           useGain(corresponds to notetag content useGain suffix1: entry1)
 *           hitGain(corresponds to notetag content hitGain suffix1: entry1)
 *           next(corresponds to notetag content next suffix1: entry1)
 *           keepCurrent(corresponds to notetag content
 *                       keepCurrent suffix1: entry1)
 *           willEnd(corresponds to notetag content willEnd suffix1: entry1)
 *           didEnd(corresponds to notetag content didEnd suffix1: entry1)
 *         - Sets the notetag to be the same as
 *           <skill progress note suffixi: entryi>
 *         - E.g.:
 *           $dataArmors[4].meta.skillProgress.cond =
 *           [{ suffix1: "switch", entry1: "1", suffix2: "var", entry2: "2" }]
 *           will set the max notetag of the armor with id 4 to be the same as
 *           <skill progress cond switch var: 1, 2>
 *    # Actor manipulations
 *      1. skillProgressCondDesc(skillId)
 *         - Returns the mapping with the condition descriptions as the keys
 *           and their statuses as the values for the skill with id skillId to
 *           progress for the actor involved
 *         - The mapping being empty means that the skill involved won't
 *           progress due to having no effective cond notetags and is thus
 *           treated as a normal skill
 *           (Reference tag: SKILL_COND_DESCS)
 *         - The mapping having only truthy values means that the prerequisites
 *           are met under the cond notetag chaining rule
 *           (Reference tag: SKILL_COND_DESCS)
 *         - (Advanced)It's supposed to return an Object
 *         - E.g.:
 *           $gameParty.aliveMembers()[0].skillProgressCondDesc(3) will return
 *           the mapping with the condition descriptions as the keys and their
 *           statuses as the values for the skill with id 3 to progress for
 *           the 1st alive party member
 *         - (Advanced)Using this script call might recache the return value
 *         - (Advanced)It's supposed to be Nullipotent other than possibly
 *           recaching the return value
 *      2. maxSkillProgress(skillId)
 *         - Returns the maximum experience needed to end progressing the
 *           skill with id skillId for the actor involved
 *         - (Advanced)It's supposed to return a positive Number
 *         - E.g.:
 *           If the maximum experience needed to end progressing the skill
 *           with id 3 is 400 for the 1st alive party member, then
 *           $gameParty.aliveMembers()[0].maxSkillProgress(3) will return 400
 *         - (Advanced)Using this script call might recache the return value
 *         - (Advanced)It's supposed to be Nullipotent other than possibly
 *           recaching the return value
 *      3. useGainSkillProgress(skillId)
 *         - Returns the experience gain of the skill with id skillId to be
 *           progressed upon use for the actor involved
 *         - (Advanced)It's supposed to return a Number
 *         - E.g.:
 *           If the experience gain of the skill with id 4 to be progressed
 *           upon use for the actor with id 1 is 100, then
 *           $gameActors.actor(1).useGainSkillProgress(4) will return 100
 *         - (Advanced)Using this script call might recache the return value
 *         - (Advanced)It's supposed to be Nullipotent other than possibly
 *           recaching the return value
 *      4. hitGainSkillProgress(skillId, target, value)
 *         - Returns the experience gain of the skill with id skillId to be
 *           progressed upon hitting target target with damage value for the
 *           actor involved
 *         - (Advanced)It's supposed to return a Number
 *         - E.g.:
 *           If the experience gain of the skill with id 5 to be progressed
 *           upon hitting the 1st enemy with 400 damage for the actor with id
 *           2 is 100, then
 *           $gameActors.actor(2).hitGainSkillProgress(
 *           5, $gameTroop.aliveMembers()[0], 400) will return 100
 *         - (Advanced)Using this script call might recache the return value
 *         - (Advanced)It's supposed to be Nullipotent other than possibly
 *           recaching the return value
 *      5. nextSkillProgress(skillId)
 *         - Returns the list of skill ids to be learned upon ending
 *           progressing that with id skillId for the actor involved
 *         - (Advanced)It's supposed to return a list of valid skill ids
 *         - E.g.:
 *           $gameParty.aliveMembers()[$gameParty.aliveMembers().length - 1].
 *           nextSkillProgress(6) will return the list of skill ids to be
 *           learnt upon ending progressing that with id 6 for the last alive
 *           party member
 *         - (Advanced)Using this script call might recache the return value
 *         - (Advanced)It's supposed to be Nullipotent other than possibly
 *           recaching the return value
 *      6. isKeepSkillProgress(skillId)
 *         - Returns whether the skill with id skillId will be kept or
 *           forgotten upon ending its progression for the actor involved
 *         - (Advanced)It's supposed to return a Boolean
 *         - E.g.:
 *           $gameParty.aliveMembers()[$gameParty.aliveMembers().length - 1].
 *           isKeepSkillProgress(4) will return whether the skill with id 4
 *           will be kept or forgotten upon ending its progression for the
 *           last alive party member
 *      7. currentSkillProgress(skillId)
 *         - Returns the current experience of the skill with id skillId to be
 *           progressed for the actor involved
 *         - (Advanced)It's supposed to return a nonnegative Number that is
 *           not greater than the maximum experience of the same skill
 *         - E.g.:
 *           $gameParty.aliveMembers()[0].currentSkillProgress(3) returns the
 *           current experience of the skill with id 3 to be progressed for
 *           the 1st alive party member
 *         - (Advanced)It's supposed to be Nullipotent
 *      8. setCurrentSkillProgress(skillId, value)
 *         - Sets the current experience of the skill with id skillId to be
 *           progressed for the actor involved as value
 *         - (Advanced)value is supposed to be a nonnegative Number that is
 *           not greater than the maximum experience of the same skill, so
 *           it'll be clamped if it's out of range and discarded if it's not
 *           a Number
 *           (Reference tag: CURRENT_EXP_RANGE)
 *         - E.g.:
 *           $gameParty.aliveMembers()[0].setCurrentSkillProgress(3, 100) sets
 *           the current experience of the skill with id 3 to be progressed
 *           for the 1st alive party member as 100
 *         - (Advanced)It's supposed to be Idempotent
 *      9. (Advanced)raiseAllSkillProgressNoteChangeFactors()
 *         - Applies the script call
 *           raiseSkillProgressNoteChangeFactor(note, factor) to all notes and
 *           factors
 *      10. (Advanced)raiseSkillProgressNoteChangeFactor(note, factor)
 *         - Notifies that the notetag note might need to be recached due to
 *           potential changes in factor factor
 *         - note is either of the following:
 *           "cond"(corresponds to notetag content
 *                  cond suffix1 suffix2: entry1 entry2)
 *           "max"(corresponds to notetag content max suffix1: entry1)
 *           "useGain"(corresponds to notetag content useGain suffix1: entry1)
 *           "hitGain"(corresponds to notetag content hitGain suffix1: entry1)
 *           "next"(corresponds to notetag content next suffix1: entry1)
 *           "keepCurrent"(corresponds to notetag content
 *                         keepCurrent suffix1: entry1)
 *           "willEnd"(corresponds to notetag content willEnd suffix1: entry1)
 *           "didEnd"(corresponds to notetag content didEnd suffix1: entry1)
 *         - factor is either of the following:
 *           "states"(Changes in state notetags)
 *           "armors"(Changes in armor notetags)
 *           "weapons"(Changes in weapon notetags)
 *           "currentClass"(Changes in class notetags)
 *           "actor"(Changes in actor notetags)
 *           "priority"(Changes in the corresponding note priorities)
 *           "chainingRule"(Changes in the corresponding note chaining rules)
 *           "result"(Changes in all intermediate results for the note)
 *         - It's supposed to be Idempotent
 *         - E.g.:
 *           $gameParty.aliveMembers()[0].raiseSkillProgressNoteChangeFactor(
 *           "cond", "states") will notify the 1st alive party member that the
 *           cond notetags might need to be recached due to potential changes
 *           in the states or their cond notetags
 *      11. (Advanced)skillProgressNoteResult(note, part)
 *         - Returns the cached intermediate result of part part in note note
 *           for the actor involved
 *         - note is either of the following:
 *           "cond"(corresponds to notetag content
 *                  cond suffix1 suffix2: entry1 entry2)
 *           "max"(corresponds to notetag content max suffix1: entry1)
 *           "useGain"(corresponds to notetag content useGain suffix1: entry1)
 *           "hitGain"(corresponds to notetag content hitGain suffix1: entry1)
 *           "next"(corresponds to notetag content next suffix1: entry1)
 *           "keepCurrent"(corresponds to notetag content
 *                         keepCurrent suffix1: entry1)
 *           "willEnd"(corresponds to notetag content willEnd suffix1: entry1)
 *           "didEnd"(corresponds to notetag content didEnd suffix1: entry1)
 *         - part is either of the following:
 *           "states"(All effective state notetags)
 *           "armors"(All effective armor notetags)
 *           "weapons"(All effective weapon notetags)
 *           "currentClass"(All effective class notetags)
 *           "actor"(All effective actor notetags)
 *         - It's supposed to be Nullipotent other than possible recaching
 *         - E.g.:
 *           $gameParty.aliveMembers()[0].skillProgressNoteResult(
 *           "cond", "states") will return the cached intermediate result of
 *           all effective cond notetags in states for the 1t alive party
 *           member
 *      12. (Advanced)invalidateSkillProgressNoteResult(note, part)
 *         - Invalidates the cached intermediate result of part part in note
 *           note for the actor involved
 *         - note is either of the following:
 *           "cond"(corresponds to notetag content
 *                  cond suffix1 suffix2: entry1 entry2)
 *           "max"(corresponds to notetag content max suffix1: entry1)
 *           "useGain"(corresponds to notetag content useGain suffix1: entry1)
 *           "hitGain"(corresponds to notetag content hitGain suffix1: entry1)
 *           "next"(corresponds to notetag content next suffix1: entry1)
 *           "keepCurrent"(corresponds to notetag content
 *                         keepCurrent suffix1: entry1)
 *           "willEnd"(corresponds to notetag content willEnd suffix1: entry1)
 *           "didEnd"(corresponds to notetag content didEnd suffix1: entry1)
 *         - part is either of the following:
 *           "states"(All effective state notetags)
 *           "armors"(All effective armor notetags)
 *           "weapons"(All effective weapon notetags)
 *           "currentClass"(All effective class notetags)
 *           "actor"(All effective actor notetags)
 *         - It's supposed to be Idempotent
 *         - E.g.:
 *           $gameParty.aliveMembers()[0].invalidateSkillProgressNoteResult(
 *           "cond", "states") will invalidate the cached intermediate result
 *           of all effective cond notetags in states for the 1t alive party
 *           member


Plugin Commands
*      1. skillProgressCondDesc actorId skillId
 *         - The same as the script call skillProgressCondDesc(skillId) in
 *           Actor manipulations for the actor with id actorId
 *      2. maxSkillProgress actorId skillId
 *         - The same as the script call maxSkillProgress(skillId) in Actor
 *           manipulations for the actor with id actorId
 *      3. useGainSkillProgress actorId skillId
 *         - The same as the script call useGainSkillProgress(skillId) in
 *           Actor manipulations for the actor with id actorId
 *      4. hitGainSkillProgress actorId skillId target value
 *         - The same as the script call
 *           hitGainSkillProgress(skillId, target, value) in Actor
 *           manipulations for the actor with id actorId
 *      5. nextSkillProgress actorId skillId
 *         - The same as the script call nextSkillProgress(skillId) in Actor
 *           manipulations for the actor with id actorId
 *      6. isKeepSkillProgress actorId skillId
 *         - The same as the script call isKeepSkillProgress(skillId) in Actor
 *           manipulations for the actor with id actorId
 *      7. currentSkillProgress actorId skillId
 *         - The same as the script call currentSkillProgress(skillId) in
 *           Actor manipulations for the actor with id actorId
 *      8. setCurrentSkillProgress actorId skillId value
 *         - The same as the script call
 *           setCurrentSkillProgress(skillId, value) in Actor manipulations
 *           for the actor with id actorId
 *      9. (Advanced)raiseAllSkillProgressNoteChangeFactors actorId
 *         - The same as the script call
 *           raiseAllSkillProgressNoteChangeFactors() in Actor manipulations
 *           for the actor with id actorId
 *      10. (Advanced)raiseSkillProgressNoteChangeFactor actorId note factor
 *         - The same as the script call
 *           raiseSkillProgressNoteChangeFactor(note, factor) in Actor
 *           manipulations for the actor with id actorId
 *      11. (Advanced)skillProgressNoteResult actorId note part
 *         - The same as the script call skillProgressNoteResult(note, part)
 *           in Actor manipulations for the actor with id actorId
 *      12. (Advanced)invalidateSkillProgressNoteResult actorId note part
 *         - The same as the script call
 *           invalidateSkillProgressNoteResult(note, part) in Actor
 *           manipulations for the actor with id actorId


Configurations
/**
         * The this pointer refers to the Window_SkillProgressStat involved
         * This configuration has no parameter counterparts
         * Sets the skill progress stat window y position
         * Hotspot/Nullipotent
         * @since v1.00a @version v1.00a
         * @param {Number} current - The current skill progress status
         * @param {Number} max - The maximum skill progress status
         * @param {Number} isKeep - If the skill will be kept upon progress
         */
        drawStat: function(current, max, isKeep) {
            var line1Rect = this.itemRectForText(0);
            var line2Rect = this.itemRectForText(1);
            var line1Text = "Progress: " + current + "/" + max;
            var line2Text = "Is Kept After Progress: " + isKeep;
            this.drawText(line1Text, line1Rect.x, line1Rect.y, line1Rect.width);
            this.drawText(line2Text, line2Rect.x, line2Rect.y, line2Rect.width);
        }, // drawStat


Author Notes
*      1. DoubleX RMMV Skill Progress 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 region is generally for more advanced uses, as
 *         most ordinary cases should be covered by parameters and notetags
 *      3. (Advanced)You might have to have a basic knowledge on what this
 *         Plugin Implementation does to fully utilize this plugin in intended
 *         ways and solid understanding on how this Plugin Implementation
 *         works to fully utilize this plugin with creative and unintended
 *         uses


Instructions
*      1. If you want to edit configurations instead of parameters, you must
 *         open this js file to access its configuration region
 *      2. The default plugin file name is doublex_rmmv_skill_progress_v100a
 *         If you want to change that, you must edit the value of
 *         DoubleX_RMMV.Skill_Progress_File, which must be done via opening
 *         this plugin js file directly
 *      3. If you wish to use DoubleX RMMV Skill Progress Unit Test, place it
 *         right below this plugin


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
 *         plugin in intended ways
 *      4. Decent RMMV plugin development proficiency to fully utilize this
 *         plugin with creative and unintended uses


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.


Authors
DoubleX

Todo
*      1. Add <skill progress instant suffix1: entry1>, where a falsy result
 *         from entry1 will let players to end progressing the skill at
 *         anytime they choose instead of always immediately


Changelog
*      v1.00a(GMT 0400 13-Nov-2019):
 *      1. 1st version of this plugin finished


Download Links
DoubleX RMMV Skill Progress
DoubleX RMMV Skill Progress Unit Test
DoubleX RMMV Skill Progres Compatibility