10-TICK COMBAT ENGINE

Attack Speed Breakpoints

Exact breakpoint calculations using the game's weapon and skin timing data.

FD6 / 0.1s ticks
Windup — —
Normal cycle — Hit → next normal hit
1st → 2nd hit — Delay between double attacks
Full Double sequence — 1st hit → next normal hit
NORMAL ATTACK

Normal attack breakpoints

Minimum ASCycleTicksStatus
DOUBLE ATTACK

Double Attack

—
Minimum AS Full Double sequence 1st → 2nd 2nd → next normal Status
NEXT TARGETS

Upcoming Double Attack improvements

gear cap +480%
Show calculation details
CURRENT SPEED

Timing breakdown

Speed multiplier—
Timer increment—
First-hit ticks—
Normal cooldown ticks—
Post-cooldown transition—
Effective time / hit—
SOURCE-ACCURATE MODEL

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.

Speed multiplier s = 1 + AS / 100
Timer increment inc = floor(dtRaw × AttackSpeedMultiRaw / 2³²)
First-hit ticks N = ceil(WindUpDuration / inc)
Timer at first hit T₁ = N × inc
Normal cooldown ticks C = max(1, ceil((AttackDuration − T₁) / inc))
Normal cycle 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:

Double Attack reset reset = W × (1 − 1 / 4)
Reset value reset = 0.75 × W
1st → 2nd hit G = max(1, ceil((W − reset) / inc))
Timer at second hit T₂ = reset + G × inc
Second-hit cooldown C₂ = max(1, ceil((D − T₂) / inc))
2nd → next normal hit C₂ + 1 + N
Full Double sequence 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:

Expected time / hit ((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.