Attack Speed Breakpoints
Exact breakpoint calculations using the game's weapon and skin timing data.
Normal attack breakpoints
| Minimum AS | Cycle | Ticks | Status |
|---|
Double Attack
| Minimum AS | Full Double sequence | 1st → 2nd | 2nd → next normal | Status |
|---|
Upcoming Double Attack improvements
Show calculation details
Timing breakdown
How attack timing works
The combat system advances in discrete 0.1 second simulation ticks.
Each tick adds dt × AttackSpeedMulti to the unit's
AttackTimer. Because the timer and durations use the game's
fixed-point FD6 representation, breakpoint calculations are performed using
the same integer arithmetic rather than a simplified floating-point timer.
Normal attack
A unit starts in Idle. It transitions to
WindingUp, then accumulates timer ticks until
AttackTimer ≥ WindUpDuration and the attack executes.
After the hit, the unit enters OnCooldown.
During OnCooldown, the same timer continues increasing until
AttackTimer ≥ AttackDuration. The game then resets the timer
to zero and changes the state to Idle.
The following simulation tick changes Idle → WindingUp.
The new attack then starts accumulating its normal windup from zero.
s = 1 + AS / 100
inc = floor(dtRaw × AttackSpeedMultiRaw / 2³²)
N = ceil(WindUpDuration / inc)
T₁ = N × inc
C = max(1, ceil((AttackDuration − T₁) / inc))
N + C + 1
The +1 is the simulation tick that changes
Idle → WindingUp. The cooldown is clamped to at least
one tick because, after an attack, the unit enters OnCooldown,
and the next simulation update processes that state before it can return to
Idle.
In the usual case where T₁ < AttackDuration, the expression
simplifies algebraically to
ceil(AttackDuration / inc) + 1.
That simplification is not universal: at sufficiently
high Attack Speed with a sufficiently long windup, the first hit can
occur at or beyond AttackDuration, activating the
one-tick cooldown clamp.
Double Attack
When Double Attack procs, the first attack has already executed.
Instead of returning to Idle, the game immediately changes
the state back to WindingUp.
The attack timer is set to 75% of WindUpDuration.
This comes from the game's DoubleAttackSpeedUp = 4 constant:
reset = W × (1 − 1 / 4)
reset = 0.75 × W
G = max(1, ceil((W − reset) / inc))
T₂ = reset + G × inc
C₂ = max(1, ceil((D − T₂) / inc))
C₂ + 1 + N
G + C₂ + 1 + N
Unlike the normal cycle, the Double Attack reset occurs between two
actual attacks. Its reduced timer therefore does not cancel out,
making Double Attack timing dependent on the selected weapon/skin's
WindUpDuration.
Effective time per hit
Double Chance produces two hits when it procs. If
p is the Double Chance probability, then the expected
time per damage event is:
((1 − p) × normal + p × double) / (1 + p)
normal is the normal hit-to-next-hit cycle, while
double is the complete first-hit-to-next-normal-hit
sequence when a Double Attack occurs.
The calculator reproduces the game's fixed-point timer arithmetic:
dt = 0.1s is represented by the game's F64 format,
while attack timers and durations use FD6 precision of
1,000,000. Integer fixed-point arithmetic is used for
breakpoint calculations rather than a simplified floating-point timer.