Action Skill Change
This script allows you to set an action to execute a different skill if certain conditions are met, with some probability. The condition is a formula that can use any game data available, including the action’s user as well as the action targets.
For example, if your actor’s HP is less than 50%, then there might be a chance
that each attack will be a special “critical attack” instead.
Download
Script: download here
Installation
Place this script below Materials and above Main
Usage
Tag your skills with something of the form
<skill change> id: 3 chance: 0.5 condition: a.hp < a.mhp * 0.5 </skill change>
Where
id
is the skill ID to change it to
chance
is the probability that it will be changed, as a percent
condition
is a formula that must be satisfied
The following variables are reserved for your formulas:
a - the action's user b - the action's target** (see below for warnings)
Note that a single skill may have multiple skill change tags: during the game, it will pick the first one whose condition is met and use it. If you would like your skill to do different things depending on different conditions, create multiple skill change tags with different conditions.
Per-Target mode
In the configuration, you will find an option called “Per Target Mode”. This means that the skill change is checked for each target individually, rather than checking all targets at the same time. Per-target mode is not necessary if none of your skills using the skill change property will have multiple targets.
Be careful about the targets variable. If per-target mode is OFF, then it is given as a list of targets. For example if you want to check if a target has certain states:
b[0].state?(5) # first target has state 5 applied b[1].state?(2) # second target has state 2 aplied b[-1].state?(6) # last target has state 6 applied
Can I use this to do a skill that changes with the terrain using map regions to tag the terrain type? Or do I need use something else to do that?
Is this on the map or during battle? Maps are not supported, but during battle you should be able to reference the current map region using
$game_player.region_id
Hello
I am facing some compatibility trouble between this script and your permastate one.
Basically I use invisible perma states to tag actors and enemies, for exemple “Beast”, and then have your script change the skill when the Beast state is on.
It works fine without the tag, but no more once it is on.
I have no idea if you may solve that easily. But since both are your work, i thought it might be good you know. I guess i can do without it for most cases. But it could be a problem if an enemy is revived.
Ok i just made a test and it seems more related to the permastate script actually.
Rather than using your skill change script, I wrote a damage formula on a test skill :
if b.state?(246); 100; else; 0; end
I made sure the enemy had the state with an autostate.
Without the permastate tag it deals 100 damage. With it it deals 0.
It seems like the permastate make it somehow “invisible” to the program.
Add this to the permanent states script. I will add this later
Just tested with the add-on.
It works fine now.
Thanks
Can I tag a state with this?
Hey, cool script. How about would I go changing a skill based on the weapon equipped?
I have a double cut skill, which looks strange when using a long-range weapon. I want to switch the skill
<skill change>
id: 410
chance: 1.0
condition: a.weapons?(157) == true
</skill change>
this isn't working for me. As well, I want to define a LOT of different weapons (a whole class of bows)
If you want to check by weapon ID you need to collect the ID's first and then do your comparison.
If you need help with formulas you should try one of the forums. You should get faster responses.
It works but it always shows error.. “undefined method weapons” after the skill is used.. please help
How is the skill change set up?
Hello! Sorry for bothering you all the time with this script recently, but I came to suggest something with Per Target Mode. I found it kind of cumbersome how it just executes the skill for every enemy in battle if used with All Enemies-skills, (I know there was a warning about it, but still.) so might it be feasible to make it so that it plays the animation normally and then just runs the calculation for each enemy?
What happens if the skill animation is different from the original skill?
Depends on the scale of the animation, methinks. (Center, Head, Feet or Screen) Now I'm not going to claim I know anything worth mentioning about making actual code, but can't it be at least made so that Screen-wide animations don't play four times for each enemy? Or maybe make Per Target Mode apply only to skills that actually CAN change..?
If nothing can be done, then I can just suck it up and deal with it, the script is excellent as it is, but I just wondered if it could be improved a bit.
You have a chicken and egg problem: skills are only checked if they can changed for each enemy, if per target mode is on. If you want per target mode to be on only if the skill can be changed for the enemy, well, that wouldn't work.
If you mean that per target mode should only be applied if the skill has ANY skill change note-tags, then yes that could be done.
For the animation type, let's suppose your skill could be changed to a fire magic that turned the entire screen red depending on the target, or it could be changed to an ice magic that turned the entire screen blue depending on the target. If you only played one animation, which one would be played?
Yeah, I meant ANY notetag. I guess that's the only sensible thing that can be done, eh? Don't suppose Per Target can be made into a notetag or made work with Single Target Skills only, either.
Per-target mode is only relevant for skills that target multiple enemies. The only advantage to turning on per-target mode for single-target skills is so your formulas are easier to write.
If a skill targets all enemies, and you didn't want per-target mode, then the skill change would be evaluated before the skill is used, and you need to use array access syntax for your conditions because there are multiple targets.
I see what you mean. In that case, I simply have to see what works and what doesn't with my project. Thank you for your patience!
There is definitely room for more options in the form of note-tags or otherwise, but I don't know what they might be that would make sense.
Hello again, I came to notice that this script doesn't seem to support your Enemy Levels-script. (That, or a.level = b.level is not valid for making the skill change if the enemy has the same level as the user does.) Is there something that can be done with this?
Comparing whether two values are equal is done using ==, not =
Aha, so it's me just being dumb! Thank you.
Wait, hold the phone, it still doesn't recognize "level" as a valid value. It gives a NoMethodError on Line 135 saying that
undefined method 'level' for#(Arrow Left)Array:0x9b25b70(Arrow Right)
This is a non-intuitive part of the script and is only noticeable if you read the usage instructions, but there are two modes: per-target mode and non per-target. The purpose of per-target mode is to allow a single skill to be changed for each target (rather than just changing it at the beginning).
If you want this behavior, in the configuration look for Per_Target_Mode and set it to true.
Also, <arrows> should work fine now
Huh, by gum, it works now! I thought Per-Target Mode was meant for Multi-Target Skills. Thank you again!
The instructions are vague now that I have read them again.
But ya, I probably should just turn it on by default since most people probably assume it's on.
Hello! I wanted to ask, is it possible to make the skill change if the enemy used an attack of a certain element? Let’s say, enemy uses Thunder, then Actor #2 uses an attack that draws the electricity into his sword to make his next attack more powerful.
You would need to use a different script that allowed you to keep track of what actions were used, and then use the condition in your skill change to check whether an appropriate skill was used.
Oh, I see. Well, thank you for quick reply regardless!
After more testing switching is based on the first switch read so…
Skill switch 1 :
id: 150
CHANCE: 1
condition: a.luk > b[0].luk + 20
id: 3
CHANCE: 1
condition: a.luk > b[0].luk + 10
Would make it so if:
20 or more luck over enemies, would go to skill 150
10 or more luck over enemies, would go to skill 3
PS:: Thank you so much this script has made my day ^_^
I see what you mean now. I thought you were asking specifically to perform the skill more than once. Yes, for stats in general, the condition formula should be flexible enough for basically anything. Being able to assign multiple skill change tags depending on which condition is a good idea.
Good… This has solved all plight Iv had with the stat system. No near meaningless stats now.
is there a way to tie skills with stats…
Example : If AGI = 40+ add +1 repeats ?
Is there also a way to make it so.
Example : If actor AGI is 20+ > enemies AGI then add +1 repeats?
No, this simply changes the skill used during an action. Might be something that can be considered for a separate script.
I would honestly love to see that… would turn RPG maker around for me being able to tie skills to stats directly.
Currently the only thing that is tied to stats are through the damage formula.
Actually Iv figured out how to do both, Ill be nice enough to share.
id: 3
CHANCE: 1
condition: a.luk > b[0].luk + 10
Add this to skill notes and attack 3 will play when the user has over 10 luck over the enemy.. Just keep making skills for each Luk upgrade (in this case) and set it to the next skill for a certain amount of Luk over enemy 10 in this case b[0].luk + 10
I didn’t know I was going to need this, until I did, and now that I do, I have to say.
So awesome.
This is without a doubt one of the most understated scripts in your list. The possibilities for boss battles is CRAZY.
I should definitely work on providing more examples on how the script could be used. I think the biggest thing that makes it difficult is that a lot of my scripts rely on users knowing how to write ruby formulas, which is a pretty heavy requirement. Being a strong formula writer would allow you to do all sorts of things, and is something that should be developed more in general.
Support for checking targets has been added. Note that because a skill can have multiple targets, you are given a list of targets and need to access them appropriately. See examples.
how will i use a specific state as a condition? example: enemy is in state of sleep, then skill 1 will be changing into skill 2. . very helpful script but i think we more example formula :”) THANKS.
a.state?(23)
Assuming 23 is your sleep state.
thanks, same as weapon? d.weapon?(X)
i use this formula, doesn’t work
id: 192
chance: 1.0
condition: b.state?(27)
I didn’t write `b`. I have updated the description to explain what `a` is.
a stands for the user
b stands for the target right? >.< kind a confuse.
This script doesn’t support target, although I might have some idea how to do it.
that will be useful. i was planning for dream eater skill or something. when the enemy is asleep so the skill deal dmg rather than sleep effect.
-You said that you have an idea to do it. that will be a “Legendary” , that script can make all skill flexible. i’ll be waiting for that script ^_^ btw. Thanks a lot
Pretty cool… It makes a nice addition to the possibilities of skills