Ok, assuming I am reading this all right, I have found the issue.
There is indeed a 33% movement speed reduction cap, but they got it wrong.
function MoveMult( unit, buffName )
local moveSpeed = BuffCalculate(unit, buffName, 'MoveMult', unit:GetBlueprint().Physics.MaxSpeed)
local itemSlowCap = unit.MoveSlowCap
if moveSpeed < itemSlowCap then
moveSpeed = itemSlowCap
end
# Cap both min speed and max speed
local minSpeed = unit:GetMaxSpeed() * 0.66 <------------------ 1
local maxSpeed = 14
if moveSpeed > maxSpeed then
moveSpeed = maxSpeed
elseif moveSpeed < minSpeed then
moveSpeed = minSpeed
end
unit.Sync.MovementSpeed = moveSpeed
# Figure out what the percent change is from the unit's base speed
# We use that multiplier to figure out how much to increase/decrease the move
local val = moveSpeed / unit:GetBlueprint().Physics.MaxSpeed
unit.Sync.MoveBoost = val * 100 - 100
unit:SetSpeedMult(val) <----------------- 2
unit:SetAccMult(val)
unit:SetTurnMult(val)
#LOG('*BUFF: Unit ', repr(unit:GetEntityId()), ' buffed speed/accel/turn mult to ', repr(val))
end
The first line I point to above is supposed to get the unit's max speed and multiply by 0.66 to set the lower end of the cap. Unfortunately, this is the GetMaxSpeed() function:
GetMaxSpeed = function(agent)
local speed = agent:GetBlueprint().Physics.MaxSpeed
local speedMult = agent:GetSpeedMult() <-------------------- 3
return speed * speedMult
end,
See where it gets the Speed Multiplier (#3). Well, that multiplier is updated by marked line #2. This defeats the whole cap. Every time a players speed gets reduced it updates the multiplier. This multiplier is then used when determining the units max speed when you apply another debuff.