taaspider

Veteran
Veteran
Joined
Jan 27, 2017
Messages
151
Reaction score
178
First Language
Portuguese
Primarily Uses
RMMV
TAA_SkillMastery - v1.2.1
Created by taaspider

Terms of Use
Any plugins developed by taaspider are free for use for both commercial and noncommercial RPG Maker games, unless specified otherwise. Just remember to credit "taaspider".

Redistribution of parts or the whole of taaspider plugins is forbidden (which also includes reposting), unless it comes from the official website (linked within the post). You are allowed to edit and change the plugin code for your own use, but you're definitely not allowed to sell or reuse any part of the code as your own. Although not required to use my plugins, a free copy of your game would be nice!


Introduction
This plugin provides functions to add levels and specific level settings to skills. Its goal is to allow a sense of skill mastery, meaning that as a character uses a skill he may slowly get better at using it. What "getting better" means is completely up to the developer: the skill can get stronger, require less MP to cast, add a state with a critical blow, boost party morale increasing defense, and so on. The plugin includes damage modifiers and custom effects that can be applied to specific skill levels, increasing the fealing of getting more powerful as skill mastery grows!

Here's a list of the plugin's main features:
  • Loading skill level data through a JSON file, making it easier to configure and evolve level data throughout the game development;
  • If you're not comfortable working with JSON files, you can also configure skill level data through the Plugin Manager;
  • Provides not only formulas for level variations, but also allow more refined control of each skill aspect for each new level;
  • Allow TP gain to be affected by skill level progression;
  • Skill descriptions change as it levels up;
  • Have specific effects (like applying a state or setting a variable) change as the skill progresses;
  • Make as so skill levels can have specific requirements that must be met before skill XP can be gained to achieve the next level (or prevent a character to learn it in the first place);
  • Allow skills to only gain XP for each battle won, or even restricting it to only when the actor survive the battle;
  • Allow enemy skills to progress as well;
  • Have some skills be unable to level up (like default Attack and Guard skills);


Warning: I'm yet to test the plugin with large numbers of skills, both using a JSON file or the Plugin Manager as source. Although I don't expect that to be a problem while playing the game, I'm worried that its initial setup may affect game load time. If you do test it out before I do please let me know the results so I can act on it faster!

Screenshots


How to Use

You can download the plugin here.

You can also test the plugin using my sample demo project. It was built with MV, but you can open it with MZ as well (just open the game.rmmzproject file and you're good to go).

Place the file in your game's data folder and tell the plugin through the Plugin Manager its name and how to read its objects. While using this option, ignore the parameter "Plugin Manager Skills" should be ignored, as it won't be used.

You can find below basic instructions as to how to setup your JSON file. You must follow the same structure, but you can change each object name to your liking through the plugins parameters.

[
{
"id": <skill id>,
"xpType": 1,
"default": {
"mpCost": <cost>,
"tpCost": <cost>,
"tpGain": <gain>,
"damage": "<damage formula>",
"req": "<requirement, if any>",
"description": "<skill description>",
"dmgMods": [ "<damage modifier tags here", "<dmgMods>", ... ],
"customEffects": [ "<effects tags here>", "<effects>", ... ]
},
"formulas": {
"mpCost": "<cost formula>",
"tpCost": "<cost formula>",
"tpGain": "<gain formula>",
"xp": "<xp formula>"
},
"levels": [
{
"mpCost": <cost>,
"tpCost": <cost>,
"tpGain": <gain>,
"damage": "<damage formula>",
"req": "<requirement, if any>",
"description": "<skill description>",
"dmgMods": [ "<damage modifier tags here", "<dmgMods>", ... ],
"customEffects": [ "<effects tags here>", "<effects>", ... ]
},
{
"mpCost": <cost>,
...
}
]
},
{
"id": <skill id>,
...
}
]

"xpType" must be used to identify how the skill gains xp. There are three possible values:
  1. Skill uses
  2. Battles won
  3. Battles survived
If no value is provided, the plugin will assume "Skill uses" as default.

The "default" tag includes what are the default values if no level specific data is found (so if these are set, you probably won't need to define data for the skill's first level). The plugin will always search first for specific level data, then defaults, and if none are found it will use the values set through RPG Maker's interface.

The "formulas" array is optional, and must be used only if you want to set formulas for MP and TP cost, TP gain or a custom XP curve formula. If setting a formula, the word "level" will be replaced by the plugin with the current skill level.

The "levels" array is used to include specific changes introduced by each level. You don't need to defined all tags for each level if their values are not changed. For example, if MP cost remains constant until level 5, you can omit the mpCost tag from levels 1 to 4 and use it only on the default array, or defined it only on levels 1 and 5.

The "requirements" tag work different than the others, as it is cumulative. So a higher level requirement is the sum of all previous level requirements. That is to prevent inconsistencies if a character tries to learn a skill at a higher level without meeting the requirements for its weaker versions.

The "levels" array must list level object in order. If you want to skip changes on a level, simply replace the object with "null" or an empty object "{}", like the example below:

"levels":[
null,
{
"mpCost": 100
},
{},
{
"tpCost": 10
}
]

If a skill has no data defined in the JSON file, skill levels will be disabled (the skill will always be listed as being at the starting level).

The tags "dmgMods" and "customEffects" are arrays of specific plugin code that allows you to program damage modifiers and special custom effects for each level. For a list of supported tags, please refer to the proper section below.

Configuring skills through the plugin manager follows a similar structure as doing that from a JSON file. The same options are applied, but a few details are handled differently:
  • Whenever MP Cost, TP Cost or TP Gain are set as -1, the value is ignored by the plugin;
  • Blank descriptions, requirements, or damage formulas on a specific skill level won't override the previous level value, contrary to what happens when using a JSON file;
Just keep those rules in mind and follow the parameter windows. Remember that a parameter set in one level overwrites the value set in a previous level, but Custom Effects and Damage Modifiers must be set for each level for it to take effect (those two are not incremental like the rest).

Skill requirements are treated as eval statements. To make use of the user's data (be it an enemy or an actor), use the suffix "a". For example, to define a requirement where agility is higher than 80, use:
a.agi > 80

You can add more conditions with && (and) or || (or). For example: a skill level that requires agility higher than 80, and also have the skill with id 10 already learned:
a.agi > 80 && a.hasSkill(10)

If you want to set a requirement for having a skill at a specific level, just use the function hasSkill with two parameters, being the first the skill id and the second the required level:
a.agi>80 && a.hasSkill(10, 2)

Damage Modifiers are special codes that changes the skill damage formula. Any specific skill can have multiple modifiers. If a level specific modifier is set, it replaces any previous modifiers for the skill. This makes it easier to manage damage progression from one level to another.

Currently, the following modifiers are supported:

CRITICAL: <TYPE>
Replace <TYPE> with one of the options below:
- 0 or NORMAL: Fall back to MVs default critical hit formula;
- 1, NEVER or DISABLE: Remove any chance of the skill resulting in a critical hit;
- 2, ALWAYS, ENABLE or FORCE: Force critical hits on all skill uses;
Examples:
CRITICAL: 0
CRITICAL: ENABLE
CRITICAL: NEVER

DAMAGE MOD: <mod>
DAMAGE MODIFIER: <mod>
Use one of "<mod>" formats to change the skill damage formula:
- <oper> x, <oper> x%: Replace <oper> by +, -, * or /. This will apply the specified operand to add, remove, multiply or divide the damage formula result by the specified number;
Examples:
DAMAGE MOD: +10
DAMAGE MOD: *2
DAMAGE MOD: -5
DAMAGE MODIFIER: +2%
DAMAGE MODIFIER: *10%
- EVAL <expression>: Applies an eval to <expression> to append a clause to the damage formula results;
Examples:
DAMAGE MOD: EVAL * (a.hp/a.mhp)
DAMAGE MOD: EVAL + (a.mp/5)

Despite all examples being listed in upper case, the plugin is case insensitive.

While damage modifiers are applied before the skill is performed, changing the damage output, custom effects are applied AFTER the skill use.

Currently, the following tags are supported:

ADD STATE: <state> <who>
REMOVE STATE: <state> <who>
Use this effect to add or remove a state effect after the skill is used. Replace <state> with the state ID or state name enclosed in double quotes, while <who> must be replaced by one of the following clauses, specifying who will be affected:
  • USER: Affects the skill user;
  • PARTY: Affects the user's whole party (or troop, if used by an enemy);
  • TARGET, or TARGETS: Affects the skill target, be it one or many;
  • DEAD ALLIES: Affects all KOed party, or troop, members;
  • DEAD ENEMIES: Affects all KOed enemies, or party members;
  • ALIVE ALLIES: Affects all alive party, or troop, members;
  • ALIVE ENEMIES: Affects all alive enemies, or party members;
  • PARTY BUT USER: Affects the whole party, except the user;
  • ENEMIES BUT TARGET: Affects all enemies, except the skill targets;
Examples:
ADD STATE: 10 USER
REMOVE STATE: "Poison" ALIVE ALLIES
ADD STATE: "Bleed" ENEMIES BUT TARGET
REMOVE STATE: 15 PARTY

SWITCH n: <action>
SWITCH n - m: <action>
SWITCH n to m: <action>
Changes one or a series of switches states (replace n and m to specify your range). The tag <action> can be replaced with one of the following effects:
  • on: Set the switch to TRUE;
  • off: Set the switch to FALSE;
  • toggle: Toggle switch value;
  • switch x: Copy switch x value;
Examples:
SWITCH 1: on
SWITCH 5 - 10: off
SWITCH 2 - 4: toggle
SWITCH 10: switch 1

SWITCH n: EVAL <expression>
SWITCH n - m: EVAL <expression>
Changes one or a series o switches states (replace n and m to specify your range) according to the result of an eval operation. The tag <expression> must be replaced with a script that returns true or false, or integers (where anything greater than zero will become true, and less or equal to zero false).
Examples:
SWITCH 1: EVAL a.hp/a.mhp > 0.5
SWITCH 2 - 8: EVAL a.hasSkill(4, 5) && a.mp > 150

VAR x <action>
VAR x - y <action>
VARIABLE x <action>
VARIABLE x to y <action>
Changes one or a series of variable values (replace x and y to specify your range). The tag <action> can be replaced with one of the following effects:
  • = N: Sets the variable or range to value N. You can also set to the same value of the variable N using "= v[N]" instead;
  • += N: Add N to the value of the variable. You can also add the value of the variable N using "+= v[N]" instead;
  • -= N: Subtract N from the value of the variable. You can also subtract the value of the variable N using "-= v[N]" instead;
  • *= N: Multiply the variable's value by N. You can also multiply by the the value of the variable N using "*= v[N]" instead;
  • /= N: Divide the variable's value by N. You can also divide by the value of the variable N using "/= v[N]" instead;
  • %= N: Replace the variable's value by the rest of the division of its current value by N. You may also use "%= v[N]" to divide by the value of the variable N;
Examples:
VAR 1 = 10
VARIABLE 7 += v[8]
VAR 2 - 7 *= 2
VAR 1 to 4 /= 3

VAR x: EVAL <expression>
VAR x - y: EVAL <expression>
VARIABLE x: EVAL <expression>
VARIABLE x - y: EVAL <expression>
Changes one or a series of variable values (replace x and y to specify your range) according to the result of an eval operation. The tag <expression> must be replaced with a script that returns integers greater or equal to zero.
Examples:
VAR 1: EVAL Math.floor((a.hp / a.mhp) * 100)
VARIABLE 6 - 11: EVAL Math.round(a.mp / a.hp)
VARIABLE 3: EVAL $gameVariables.value(1) + a.hp

EVAL: <eval clause>
Runs an eval on the <eval clause>. You can access the skill user data using the object "a" (a.hp, a.mp, a.hasSkill(<skillId>), a.actorId(), ...).
Examples:
EVAL: $gameVariables.setValue(1, a.actorId())
EVAL: a.hp > 100 ? $gameVariables.setValue(1, a.hp) : $gameVariables.setValue(1, 100)
EVAL: $gameVariables.setValue(1, Math.min(100, a.hp))

COMMON EVENT: N
Call common event of number N. One important limitation though, is that a multiple Common Event calls as custom effects of the same skill is not currently supported. If you try to insert two or more COMMON EVENT effect, only the last one will be run. You can have one for each level, but not more than one by level.
Examples:
COMMON EVENT: 10

ON CRITICAL
Add this clause to the start of any of the previous custom effect tags so that it will only take effect if the skill has landed a critical hit.
Examples:
ON CRITICAL ADD STATE: 5 USER
ON CRITICAL SWITCH 3: on
ON CRITICAL VAR 7 += 1
ON CRITICAL COMMON EVENT: 2

Note tags can be applied to classes, actors or enemies to define starting skill levels. You can set it one at a time using the full tag, or enclose a list of skills between skill mastery tags:

<TAA_SKM: S[1], L[1], X[10]>

or

<TAA_SKM>
S[1], L[1]
S[2], L[2], X[11]
</TAA_SKM>

You can also specify an interval for L and X, like this:

<TAA_SKM: S[1], L[1,3], X[0,5]>

or

<TAA_SKM>
S[1], L[1,3], X[0,5]
</TAA_SKM>

"S" stands for skill, so the number inside the square brackets must be a valid skill id. "L" means level, and defines the starting level. "X" is xp and is an optional tag. It defines that the skill starts with an amount of xp already gained. This allows you to setup enemies and make it more likely that their skills can level up during battle, or that a playable character included to the party have a skill halfway to the next level.

If you specify an interval for L or X instead of a fixed number, the plugin will calculate a random number inside the interval. This way you can have, for example, enemies in a troop with random experience in the same skill, so that each one may level up at different times. The goal here is to create a layer of unpredictability and make things a bit more interesting to the player!

$gameSystem.getSkillMpCost(skillId, level)
Based on a skill ID and level, returns the skill MP cost. If level is omitted, returns the cost for the skill's first level.​

$gameSystem.getSkillTpCost(skillId, level)
Based on a skill ID and level, returns the skill TP cost. If level is omitted, returns the cost for the skill's first level.​

$gameSystem.getSkillTpGain(skillId, level)
Based on a skill ID and level, returns the skill base TP gain. If level is omitted, returns the base gain for the skill's first level.​

$gameSystem.getSkillDescription(skillId, level)
Based on a skill ID and level, returns the skill's description. If level is omitted, returns the description for the skill's first level.​

$gameSystem.getDamageFormula(skillId, level)
Based on a skill ID and level, returns the skill's damage formula as text. If level is omitted, returns de formula for the skill's first level.​

$gameSystem.actorMeetsRequirements(skillId, level, actorId)
Checks if the actor meets the specific requirements to the referenced skill at the specified level. If level is undefined or out of the allowed level range, returns analysis for the skill's first level.​

$gameSystem.getSkillXpType(skillId)
Based on a skill ID, returns the XP type for the skill: 1 for skill uses, 2 for battles won and 3 for battles survived.​

$gameSystem.getSkillLevel(skillId, actorId)
Based on the skill and actor IDs, returns the skill level. If the actor doesn't know the skill, returns 0.​

$gameSystem.learnSkill(actorId, skillId, customLevel, customXp)
Teaches an actor the referenced skill. You can use parameters customLevel and customXp to start the skill at a specific level, and/or halfway to the next level. These two can be ignored if you wish the actor to learn the skill at its initial level and with no previous experience.​

$gameSystem.getSkillProgression(actorId, skillId)
Returns a number between 0 and 1, where 1 means the next level has been achieved (or the maximum level has been reached).​

$gameSystem.isSkillKnown(actorId, skillId)
Returns true if the actor knows the skill, or false if he doesn't.​

$gameSystem.hasSkill(actorId, skillId, skillLevel)
Return true if actor has skill with level greater or equal to skillLevel. If skillLevel is omitted, return true if has skill with level greater or equal to minimum level.​

$gameSystem.getCurrentSkillXp(actorId, skillId)
Returns the current XP for the skill.​

$gameSystem.getSkillXpToNextLevel(actorId, skillId)
Returns how much XP the actor must gain to reach the next skill level.​

$gameSystem.getSkillUses(actorId, skillId)
Returns the number of times the skill has been used by the actor.​

$gameSystem.gainSkillXp(actorId, skillId, xp)
Adds the specified amount of XP to actor skill.​

$gameSystem.setSkillLevel(actorId, skillId, level)
Set skill level for actor capped at the maximum allowed value.​

Learn Skill
Teach a new skill to an actor setting its initial level and XP. Using the engine default command to add a skill will still work with the skill being added at the minimum level.​

Learn Multiple Skills
Teach a set of skills to an actor at the same time. All skills will be added at their initial levels.​

Gain Skill XP
Increase experience for an actor skill. The amount of experience gained can be determined by a flat value (parameter XP) or through a variable (parameter XP from Variable). If XP from Variable is set to a valid variable, its value is used. Otherwise the flat XP value is applied.​

Change Level
Change an actor skill level. The amount of levels to change can be specified either by a flat value (Level Change) or through a valid variable (Level Change from Var).​

Notes:
  • Obviously this plugin is not compatible with any other that provide skill levels. If the plugin do not customize skill structure, it should be compatible. But at least for now I cannot garantee plugin compatibility.
  • Version 1.2.1:
    • Fixed a bug that causes the equip scene to crash on MZ;
  • Version 1.2.0:
    • Added MZ compatibility;
    • Added a new parameter to specify a list of skills which should not be leveled (like, for example, default attack and guard skills). This prevents this skills from triggering level up animations and having a level added to their names on the skill list;
  • Version 1.1.1:
    • Added support to variables within the SUMMON custom effect clause;
  • Version 1.1.0:
    • Fixed a bug when skill level was not initialized on database. Using the skill would cause the game to crash;
    • Updates custom effect for Add/Remove state:
      • Changed function used to apply/remove state, so that state resistance and intensity are considered. Previously states were added and removed always with 100% chance;
      • Added option to define how likely the state will be applied/removed, much like what we have in the editor;
      • Added options to create conditions before applying/removing states. There's three options: check value of one variable; test one switch; or go wild with an eval clause;
    • Added custom effect integrated with TAA_EnemyReinforcements, allowing skill levels to change reinforcement summoning behavior.
    • Added a new plugin parameter that allows you to disable EnemyReinforcements note tags and use only custom effect for skill levels. If the parameter is disabled, tags included in a skill are always processed, regardless of the skill level. Otherwise, only custom effect SUMMON clauses are considered;
  • Version 1.0.2:
    • Few minor bug fixes;
    • Change in terms of use;
  • Version 1.0.1:
    • Included new custom effects:
      • EVAL clause;
      • Setting variables with eval clauses;
      • Setting switches with eval clauses;
    • Included the option to use intervals for level and xp note tags;
  • Version 1.0.0: Initial release!
 
Last edited:

jno8034

Villager
Member
Joined
Mar 4, 2021
Messages
9
Reaction score
3
First Language
English
Primarily Uses
RMMZ
I hope its okay that I bump this back up.
This is the first plugin I've ever used that has me completely stumped.

I'm trying to build a bootleg Legend of Dragoon addition system in my game so this plugin was perfect since YEP doesn't have a Skill Mastery Plugin for MZ.

I tried to integrate this into my existing project and it didn't seem to be working so I decided to just make sure everything was working and opened a brand new fresh file no other Plugins, no anything. I cleared everything out except for 1 actor, with 1 skill, and no matter what I manipulate, either through the Plugin Manager or the JSON file itself (admittedly not a strong suit of mine), it's essentially as if the plugin isn't even turned on. There's no noticeable change going on.
I tried the demo project and that all works fine, so I'm really confused as to why this isn't working for me.

Not asking for a step by step hand-hold, but maybe some clearer guidance on what things to make sure are done, like a checklist from OP. Or some ideas from others who have had this Plugin working for them.

Thank you so much in advance.
 

taaspider

Veteran
Veteran
Joined
Jan 27, 2017
Messages
151
Reaction score
178
First Language
Portuguese
Primarily Uses
RMMV
I hope its okay that I bump this back up.
This is the first plugin I've ever used that has me completely stumped.

I'm trying to build a bootleg Legend of Dragoon addition system in my game so this plugin was perfect since YEP doesn't have a Skill Mastery Plugin for MZ.

I tried to integrate this into my existing project and it didn't seem to be working so I decided to just make sure everything was working and opened a brand new fresh file no other Plugins, no anything. I cleared everything out except for 1 actor, with 1 skill, and no matter what I manipulate, either through the Plugin Manager or the JSON file itself (admittedly not a strong suit of mine), it's essentially as if the plugin isn't even turned on. There's no noticeable change going on.
I tried the demo project and that all works fine, so I'm really confused as to why this isn't working for me.

Not asking for a step by step hand-hold, but maybe some clearer guidance on what things to make sure are done, like a checklist from OP. Or some ideas from others who have had this Plugin working for them.

Thank you so much in advance.
Hi there!

Well, I haven't gotten much feedback from this one. Since I wrote all the code, I'm biased when it comes to reading the documentation hehe
Can you send me this test project you mentioned? I can take a look and see what's missing to point you to the right direction and add more details to the OP.
 

jno8034

Villager
Member
Joined
Mar 4, 2021
Messages
9
Reaction score
3
First Language
English
Primarily Uses
RMMZ
Thanks so much for getting back to me @taaspider

Good News:
I actually had a coding epiphany since the time of posting this and got the plugin to work via the JSON file.

Bad News:
New problem ;_;
I'm really new here and just getting the hang of the forums, so I ended up creating a new question thread with my new problem. I have linked it below. Basically the intended plugin works. I am able to set up random encounters on the default map and plug in skills and see everything working. But the equip screen crashes every single time I try to open it and it actually does that on the sample project you provided here on this post.
https://forums.rpgmakerweb.com/inde...lmastery-v1-2-0-crashing-equip-screen.134222/
 

taaspider

Veteran
Veteran
Joined
Jan 27, 2017
Messages
151
Reaction score
178
First Language
Portuguese
Primarily Uses
RMMV
Thanks so much for getting back to me @taaspider

Good News:
I actually had a coding epiphany since the time of posting this and got the plugin to work via the JSON file.

Bad News:
New problem ;_;
I'm really new here and just getting the hang of the forums, so I ended up creating a new question thread with my new problem. I have linked it below. Basically the intended plugin works. I am able to set up random encounters on the default map and plug in skills and see everything working. But the equip screen crashes every single time I try to open it and it actually does that on the sample project you provided here on this post.
https://forums.rpgmakerweb.com/inde...lmastery-v1-2-0-crashing-equip-screen.134222/
The new issue was actually quite simple to fix (can't believe I didn't see it before). I've replied to the second thread with an attached new version for you to test and confirm if everything is working. If it turn out ok then I'll officialy release it for everyone! :)
 

taaspider

Veteran
Veteran
Joined
Jan 27, 2017
Messages
151
Reaction score
178
First Language
Portuguese
Primarily Uses
RMMV
The fix is finnaly published as version 1.2.1!
 

Latest Threads

Latest Posts

Latest Profile Posts

Whenever I start on a new chapter, it doesn't feel like the next episodes, but more like sequels :)
It can be frustrating that so many commercial games have used up titles that might otherwise be great for a project.
Light up explosions with QABS and Community Lighting.
qcPQHt9.gif

Forum statistics

Threads
110,655
Messages
1,054,985
Members
143,779
Latest member
Epitaph78
Top