For those of you reading this, expect a somewhat heavily mathematical post. I’ll give a summary at the end so if you don’t want to see my math or the programs in MATLAB I wrote to automate this process, feel free to skip to the summary.
Writing this, I don’t expect this to be nearly as important or interesting as Rezal’s work on the Foregrip attachment, but I’d like to get my work on this out there in case someone wants to use it as a tool for further work.
I derived the spread reset equation last semester trying to figure out the AN-94’s best rate of fire—the one at which it maintains its perfect accuracy (which I think I calculated with .12 as the spread increase value, now that I think about it). I noted at the time that the resulting average rate of fire didn’t depend on the amount of rounds fired. I found it interesting but didn’t revisit it.
Later on, while writing my SKS review, I needed to derive the equation for its natural recoil recovery rates depending on its attachment structure. I decided to automate this process and wrote a MATLAB function to do this step-by-step for the SKS.
I’ve been asked three or four times recently natural settling rate (of recoil and spread) altered the effective rate of fire of each weapon. I redid my spread derivation and generalized the equation from my SKS review and found two formulas. I’ll go through the derivation below.
Explanation
One of the things that’s been brought up a lot recently is that spread and recoil recovery start not when a round fires but instead when the second round could be fired. This delay creates some interesting effects on rate of fire. If you wait for spread and recoil to settle between shots, you can see some interesting effects on the resulting rate of fire of the weapon.
Since you can’t compensate at all for spread, it’s obviously the main limiting factor when you talk about the performance of a weapon at range. It turns out that there is a rate of fire which gives you near-perfect accuracy on each shot in single-fire. Knowing this rate of fire may have applications for long-range shooting. However, as these tend to be rather high, I honestly don’t expect us console peasants to worry too much about this, though it’s definitely possible to get into the range of firerates at which this value is exceeded on console, much less PC.
Recoil tends to be much the same, except vertical recoil can be completely controlled and horizontal recoil can at least be somewhat compensated for. However, as the equations are linked, I decided it would be worth deriving and posting both equations at the same time.
These two factors, spread and recoil, limit your maximum rate of fire when firing in bursts of limited length. As such, it is important to understand where they tend to be for each weapon.
Assumptions:
1) Spread and recoil recovery start when the next shot could be fired.
2) Recoil recovers by finding the shortest route to the default aiming point—the hypotenuse of a triangle defined by horizontal recoil and vertical recoil.
3) No recoil compensation is performed.
Derivation of Equations
This all stems from the equation linking rate of fire and time between shots:
60/(RoF*(time between shots))=1
Spread recovery starts when the next round could be fired, at 60/RoF seconds.
Add to this the time it takes for spread or recoil to recover. Spread recovery is (SpreadIncrease/SpreadDecrease) and recoil recovery is (RecoilLength/RecoilDecrease).
Take 60/<this value> to get your new rate of fire. It’s actually quite simple.
In performing this estimation for bursts and sustained fire, interestingly enough, the length of the burst drops out of the equation for average spread recovery firerate. However, it heavily complicates the equation for recoil recovery (in the average case).
The Equations Themselves
The equations given calculate average fire rates. A longer burst requires more time to settle after it’s done but the time between individual shots in the burst is shorter. Therefore, I felt justified in giving the averages rather than the timeline of shots.
n is the number of shots fired. The other values should be self-explanatory.
HRecoil is chosen by you. If you want to find just the vertical recoil value and assume that the weapon doesn’t deviate horizontally (ideal, but not realistic), set HRecoil equal to zero. You’ll derive the vertical recoil equation. If you want to calculate the worst-case scenario (also not realistic), set HRecoil equal to its maximum value to either side. If you want to calculate the normal behavior, find the horizontal recoil’s center and use that value. Note that on some weapons (those with balanced recoil), the center of recoil will be 0.
Spread recovery—single-fire or burst
RoF=60/[(60/RoF)+(SpreadInc/SpreadDec)]
Recoil recovery—general case
RoF=60*n/[(60*n/RoF)+(RecoilLength/RecoilDec)]
Where RecoilLength is the length of a straight line between your aiming point and where the barrel is pointed. It’s the hypotenuse of a right triangle defined by horizontal and vertical recoil. Below are the equations for RecoilLength in all different cases.
Recoil recovery—just vertical—single or burst
RecoilLength=VRecoil*(InitialMultiplier+(n-1))
Recoil recovery—horizontal and vertical—single-fire
RecoilLength=sqrt{(VRecoil*InitialMultiplier)^2+HRecoil^2}
Recoil recovery—horizontal and vertical—burst
RecoilLength=sqrt{[VRecoil*(InitialMultiplier+n-1)]^2+(HRecoil*n)^2}
MATLAB Code
Call the program from your Command Window as [a,b]=RecoveryFireRate( <inputs> ). Then look up a and b from your Workspace. a is the spread recovery rate of fire, b is the recoil recovery rate of fire.
function [Spread_Reset_RPM,Recoil_Reset_RPM] = RecoveryFireRate(ShotsFired,RoF,SIncrease,SDecrease,VRecoil,HRecoil,RDecrease,InitialMultiplier)
%The inputs should be self-explanatory. Assume that spread and recoil
%recovery starts when the next round can be fired.
%SIncrease is spread increase per shot, not total spread
%For horizontal recoil, choose between the center of recoil (average), 0
%for pure vertical recoil, or the maximum value to see the worst-case
%average.
n=ShotsFired;
Net_Vertical_Recoil=VRecoil*InitialMultiplier+(n-1)*VRecoil;
Net_Horizontal_Recoil=HRecoil*n;
RecoilLength=sqrt(Net_Vertical_Recoil^2+Net_Horizontal_Recoil^2);
%This is the length of the hypotenuse created by the recoil. Recoil
%recovery acts along this line.
Spread_Reset_RPM=60/(60/RoF+SIncrease/SDecrease);
Recoil_Reset_RPM=n*60/(n*60/RoF+RecoilLength/RDecrease);
end
Just call it in the Command Window as BestRecoveryRate( <inputs> ) and the ans output will be the rate of fire limited by whichever natural recovery rate is worse.
function [RecoveryROF] = BestRecoveryRate(ShotsFired,RoF,SIncrease,SDecrease,VRecoil,HRecoil,RDecrease,InitialMultiplier)
%The inputs should be self-explanatory. Assume that spread and recoil
%recovery starts when the next round can be fired.
%SIncrease is spread increase per shot, not total spread
%For horizontal recoil, choose between the center of recoil (average), 0
%for pure vertical recoil, or the maximum value to see the worst-case
%average.
n=ShotsFired;
Net_Vertical_Recoil=VRecoil*InitialMultiplier+(n-1)*VRecoil;
Net_Horizontal_Recoil=HRecoil*n;
RecoilLength=sqrt(Net_Vertical_Recoil^2+Net_Horizontal_Recoil^2);
%This is the length of the hypotenuse created by the recoil. Recoil
%recovery acts along this line.
Spread_Reset_RPM=60/(60/RoF+SIncrease/SDecrease);
Recoil_Reset_RPM=n*60/(n*60/RoF+RecoilLength/RDecrease);
if Spread_Reset_RPM > Recoil_Reset_RPM
RecoveryROF=Recoil_Reset_RPM;
elseif Recoil_Reset_RPM > Spread_Reset_RPM
RecoveryROF=Spread_Reset_RPM;
else
RecoveryROF=(Spread_Reset_RPM+Recoil_Reset_RPM)/2;
end
%Picks which recovery rate limits your rate of fire and selects that as
%your minimum firerate.
%If the two are too close for comparison, it averages them.
end
Summary and Conclusions
I’ve been using these equations in slightly simplified forms (and individually for each weapon) for some time now and my experience indicates that most weapons lose between approximately 50 and 150 rpm to let spread settle perfectly. Recoil is more trouble to calculate given its wide variety of values and dependency on burst length.
In a nutshell, for most weapons, feel free to spam the trigger while in single fire as it’s hard to hit the maximum value for most weapons. Faster-firing weapons tend to lose more to their fire rates than slower-firing weapons of the same spread increase value.
The next post will contain spread recovery comparisons for each weapon. I’ll respond to questions and criticisms in the morning because it’s 2am and I’m tired from staying up and writing this.