As our work continues on DiabloNut more and more of the game mechanics are revealing themselves. Dorjan has been hard at work unravelling and piecing together the game data to present a coherent article on each of these mechanics.

In this first article he looks at movement speed, how it is calculated, the movement scaler and where it’s capped for you.

This article and all subsequent ones will be archived in DiabloWiki.Net.

The game engine uses lots of different settings to decide how fast you move. One in particular though is adjusted with buffs on items and others are adjusted with slows and resistances.

**What is Movement Scalar?**

Movement Scalar is the base stat used in Diablo III which is used to judged your walking rate amongst other things. This is the stat adjusted by the affixes you get on items. The formulae used in Diablo III are as follows:

**Calculating the Heroes Movement Rates:**

Stats used:

- MovementScalar (Fixed per Hero class)
- WalkingRate (Fixed per Hero class)
- StrafingRate (Fixed per Hero class)
- SprintingRate (Fixed per Hero class)
- RunningRate (Fixed per Hero class)
- MovementBonusTotal (Starts at 0)
- MovementScalarReductionPercent
- MovementScalarReductionResistance
- MovementScalarUncappedBonus

First step is to calculate the Movement Scalar Total which is done by the following formula:

MovementScalarTotal = MovementScalarCappedTotal + MovementScalarUncappedBonus

This basically means you can have a capped value which cannot go above a certain amount and a bonus which is totally uncapped. Lets look at the capped total:

MovementScalarCappedTotal = Min(1.25, MovementScalarSubtotal)

Basically this means you take whatever is lowest, 1.25 or the MovementScalarSubTotal.

So let’s work out the MovementScalarSubtotal:

MovementScalarSubtotal = Max(0.1, MovementScalar) * (1 + MovementBonusTotal) * (1 – MovementScalarReductionPercent * (1 – Min(1, MovementScalarReductionResistance)))

OK, that’s a bit much, so lets break it down:

Calc1 = 1 – Min(1, MovementScalarReductionResistance)

Min means take the lowest value, so the best Slow Resistance you can have is 1 (100%). This will be combined with the Reduction Percent Below:

Calc2 = (1 – MovementScalarReductionPercent * Calc1 )

OK, so ReductionPercent (lets say a slow of 0.60 [caltrops]) multiplied by the Resistance will be your total slowed amount, again reversed. (example: 1-0.6 = 0.4 with no resistance).

Calc3 = (1 + MovementBonusTotal)

MovementBonusTotal is unknown at present as the Scalar is used by affixes (items). Maybe skills will use this instead of the Scalar? So for now, we’ll leave this at 1.

Calc4 = Max(0.1, MovementScalar)

Now this is the one we’ve been waiting for, just how does the MovementScalar change the speed of our character? 0.1 is the default, so anything above that is a perk!

- (your bonus movement) * 1 * ( 1 – [slow %] * ( 1 – [Slow Resistance]))
- Default: 0.1 * 1 * 1 = 0.1; This would be full base speed.
- Slowed by Caltrops with no Resistance: [0.1] * 1 * ( 1 – [0.6] * (1 – [0]) ) = 0.04; You’re slow!
- Affix Run1 on your Axe: [0.15] * 1 * ( 1 – [0] * (1 – [0]) ) = 0.15; 5% increase!
- Affix Run1 on your Axe but slowed with Caltrops: [0.15] * 1 * ( 1 – [0.6] * (1 – [0]) ) = 0.06; (you’re 40% slower than someone who has no buffs or debuffs)
- Affix Run1 on your Axe but slowed with Caltrops but with 50% resistance: [0.15] * 1 * ( 1 – [0.6] * (1 – [0.5]) ) = 0.105; (Still faster than a normal character by 0.5%!)

Now back to the original formula:

MovementScalarCappedTotal = Min(1.25, MovementScalarSubtotal)

So we now know the best bonus is 1.25 which is the same as 1150% in game bonus to run speed! No point going above that then guys and girls, 1150% is your limit from this source! Of course there is the UncappedBonus, but at the moment we’ve not figured out where this is used…

MovementScalarTotal = MovementScalarCappedTotal + MovementScalarUncappedBonus

This is then used for the following Formulae:

- WalkingRateTotal = WalkingRate * MovementScalarTotal
- StrafingRateTotal = StrafingRate * MovementScalarTotal
- SprintingRateTotal = SprintingRate * MovementScalarTotal
- RunningRateTotal = RunningRate * MovementScalarTotal

Lets give WalkingRate a value of 100.

Basic speed will be calculated as: 100*0.1 = 10;

With Run1: 100*0.15 = 15;

With Caltrops: 100*0.04 = 4;

So as you can see the MovementScalar is just as it says on the tin, a % movement speed increase with a cap of 1150% on the speed gains from affixes!

Find

With thanks to OmniSliver and thendcomes for pointing out I should never do maths whilst ill and distracted!

I don’t math…

Where’s the explanation for the explanation?

What’s the square root of this building??

After a quick read, the only thing that stuck for me was the 250% cap on the bonus. 🙂

Good work Dorjan, I’ll try to absorb the rest of it later. 🙂

That’s the takeaway alright, but it’s neat to be able to see the math too.

Great article!

Typo here:

” Some buff: 0.1 * 1.25 * 1 * 1 = 1.125; ”

Should be:

” Some buff: 0.1 * 1.25 * 1 * 1 = 0.125; ”

Also, “Full Resistance: 0.1 * 1 * 0 * 0 = 0; You would be unable to move.” That really makes no sense, and it’s because the formula would be 0.1*1*(1-0*(1-1)) = 0.1, assuming that MovementScalar <= 0.1, which we don’t know.

Another issue with not knowing the value of MovementScalar is that we can’t know how much is the maximum effective bonus. If MovementScalar is 0.1 (as is assumed through the calculations), then the maximum would be 1.25/0.1=12.5=1250% times the base 0.1 speed. That is a 1150% bonus, not 250%.

Double checked your calc and it’s correct. The article is wrong.

What I want to know is where the variables come from in game! Those are important.

Guesses:

MovementBonusTotal – Cumulative bonuses from gear and skills. eg. 7% increase walking speed on boots, 10% from Monk Fleet Footed, or 60% form DH Tactical Advantage. Probably additive, but IDK.

MovementScalarReductionPercent – Cumulative debuffs from snares. eg. in pvp you would be snared 60% by Caltrops.

MovementScalarReductionResistance – Does anything in the game give partial resistance? The only things I can think of are skills that make you immune to snares, like Monk’s Serenity.

MovementScalarUncappedBonus – If MovementBonusTotal are your buffs, then what is this?

0.1*1*0 = 0

Your example: 0.1*1*(1-0*(1-1))

1-1 = 0;

1-0 = 1

0.1*1 = 0.1

But if you set the var to 1 you get 1-1 = 0 thus 0.1*1*0 = 0

If you multiply anything by 0, you get 0…

edit: What I mean is MovementScalarReductionResistance is 1 for full resistance (1-1 = 0 so multiplying by 0 = 0 speed.) and 0 for no resistance so 1-0 = 1 so full speed.

Order of operations sir. 0 gets multiplied to (1-1) and then that result is subtracted from 1.

Your given formula could be rewritten more clearly like this:

0.1 * 1 * (1 – (0 * (1 – 1))).

If this is not correct, then your original formula is wrong and should be:

0.1 * 1 * ((1 – 0) * (1 – 1)).

Aren’t all brackets worked out first in order of operations? So the 1-1 would happen first. Dorjan is right

MrRawr, I can’t reply to your post for some reason. Parentheses do go first, but multiplication goes before addition or subtraction. Dorjan is wrong. See the post you responded to as to why. Here’s the correct order:

(1-1) = 0

0*(1-1) = 0

(1-0*(1-1)) = 1

1*(1-0*(1-1) = 1

0.1*1*(1-0*(1-1) = 0.1

I have to assume you’re wrong at this point else if you have 1 resistance or 0 it would make no difference according to your maths. I’m going to have to look at the article when I get more time to see where the confusion is happening though, thanks for taking the time to check my workings out, I just want the most accurate information too!

Give me a few hours and I’ll check back on this, I’ve something to do first.

OK I see where I went wrong now! I derped and I hold my hands up. Fixed now and the wiki article.

Thanks! I was writing that quickly whist doing another thing which is coming very shortly.

Is this other thing related to what we were talking about a few days ago by any chance? 🙂

Why yes it is… and for you to be the first to know… http://diablonut.incgamers.com/item/broad-axe

but shuuush, don’t tell anyone 😉

What about the uncapped bonus, can’t movement scalar go above 1.25 using that?

Agreed. Until the sources of the variables are confirmed, this article isn’t very useful. There are two variables for Bonuses with no mention of what sources drive each one.

So am I correct in understanding that %modifiers are just as misleading as “yards” in the game? Whats the point of using useless scales and measurement systems if blizzard does not respect that definition of them? Maybe I’m wrong but +250% movement =/= 1.25 and 10yards =/= 6 feet. What a fail, call it anything, make up a unit system, even just go the lazy way and call them speed modifier units, anything, who cares, but math is math, and blizzard just gives a bad example of how to use it…so what, now they will intuitively teach that 250% movement modifier is really only 25% better, and 5yards = 3 feet? Blizzard its not hard…come on.

You’re getting confused by the math, but there is nothing confusing about how movement speed bonuses work. If you have 10% on boots and 10% from Fleet footed, you’ll be running 20% faster (assuming they’re additive, and no snares).

The point of the article was to find a cap on movement speed bonus, but it didn’t do so correctly – yet.

MovementScalarCappedTotal = Min(1.25, MovementScalarSubtotal)

No matter what way you look at it, the best improvement you’ll get on screen is 25%, item bonuses wise, it seems not everyone agrees but that’s the hardcap from bonuses. anything*1.25 = 25% increase.

See Elfik’s post above. Then what is MovementScalarUncappedBonus? Do you know what the source of that variable is?

Either way, i hope they support both ASDW and mouse type movement.

And QWOP.

You forgot to carry the x….

Walking, strafing, sprinting, running?

What’s the difference and how do you activate the different movement types?

Nice work.

geeeez! just post the code next time, it would be less confusing. typing in here on a smartphone still lags very annoyingly by the way. 😯

Umm, there a mistake in the % IMS needed to cap out.

The base value for MovementScalarCappedTotaland is 0.1 movement units. As show by MovementScalarSubtotal = Max(0.1, MovementScalar) * (1 + MovementBonusTotal) * (1 – MovementScalarReductionPercent * (1 – Min(1, MovementScalarReductionResistance))), and is capped for this is 1.25.

Take a 250% boost that is 3.5*0.1 that gives only 0.35 no where near the cap.

So to cap it out given max is 1.25 and default (assuming MovementScalar is at it max of 0.1 and no slows are in effect) then the % need to cap movement speed is (1.25/0.1)-1*100=1150% IMS needed.

Though of cause it can get even higher because of the +MovementScalarUncappedBonus what ever this is.

OK article updated to show everything more clearly!

Great job man! Looks good to me.

Do monsters and bosses use the same formula?

Aye, for every creature/hero