Dual-wielding is the concept of holding a weapon in each hand instead of a weapon and a shield, or a two-handed weapon. It’s a fun way to give your characters more options for customization. The problem with the way RPG Maker MV handles dual wielding is that there’s no visual feedback from it. Your attack animation still only hits one time, no matter how many weapons you hold.
Plugin woes
I’ve been using a plugin to fix this issue. But it’s been giving me grief, randomly changing my character’s stats between each weapon swing and leaving them permanently altered. The plugin’s support was shaky anyway, so rather than spend time troubleshooting, I looked for an alternative.
A practical solution
RPG Maker forums user Arkzein shared a code snippet using Yanfly’s action sequences to simulate a proper dual-wielding effect.
It does what it should quite elegantly, allowing the user to swing each weapon individually and letting those hits have different strengths depending on the weapon’s strength. I added a few extra features to it, including
- a check to see if the weapon fires long-distance, or if the player should approach their target before the attack begins.
- a check to see if the user is carrying two weapons (so it acts like a regular one-hit attack for users with one weapon).
- a check to see if the 2nd weapon has a different animation than the first (otherwise it just repeats the first animation).
Sample code
Here’s the snippet in full:
// M.o.v.e. forward a little i.f. firing a missile
if user.attackMotion() == 'missile'
move user: forward, 48, 10
wait for move
else
// M.o.v.e. to the target
move user: target, front base, 10
wait for move
end
// I.f. the user has multiple weapons + dual-wield
if user.weapons().length > 1 && user.isStateAffected(129)
EVAL: user._weap1 = user.weapons()[0];
EVAL: user._weap2 = user.weapons()[1];
// Unequips second weapon
EVAL: user.forceChangeEquip(1, null);
// 1st weapon attack
MOTION ATTACK: user
MOTION WAIT: user
action animation
wait for animation
action effect
EVAL: user.forceChangeEquip(0, user._weap2);
// 2nd weapon attack
MOTION ATTACK: user
MOTION WAIT: user
// animation of 2nd weapon
EVAL: target.startAnimation(user.weapons()[0].animationId);
wait for animation
action effect
// Restores weapons
EVAL: user.forceChangeEquip(0, user._weap1);
EVAL: user.forceChangeEquip(1, user._weap2);
else
// Regular 1 weapon attack
MOTION ATTACK: user
MOTION WAIT: user
action animation
wait for animation
action effect
end
action>
The weird dots in the comments are because action sequences don’t have the concept of comments. So if I didn’t put dots in between the letters of “i.f.” it would be interpreted as a programmatic if statement.