How this is worked out.
Gear speed is subject to diminishing returns before anything else happens:
effective = floor(120 × IAS ÷ (120 + IAS)).
Base attack speed and the weapon speed modifier are then added at full value:
clamped so the resulting rate stays between 15% and 175% — or 250% while shapeshifted.
The animation then runs at rate = floor(AnimationSpeed × (100 + total) ÷ 100) and takes
ceil(256 × BaseFrames ÷ rate) − 1 frames. Casting is the same shape with its own ceiling: rate = min(120 × FCR ÷ (FCR + 120) + 100, 196), then animSpeed = rate × AnimationSpeed ÷ 100. That ceiling is what makes 500 the highest faster cast rate worth carrying — beyond it the rate stops climbing. Vanilla sets it at 175, which would stop you at 200. The 175 ceiling is reached at exactly 200 FCR, so nothing above that changes anything.
Whirlwind reads different numbers. Every other skill pools your whole character:
all increased attack speed together, diminished, then base attack speed added flat. Whirlwind instead reads increased attack speed and base attack speed from the weapon's own properties and nowhere else, and does not diminish either of them. Speed from rings, armour, auras, buffs and curses simply does not reach it.
Every other skill reads the unit's aggregate , which already contains the weapon's increased attack speed
along with everything else you wear — no skill singles the weapon out, so only the total matters. That is why the
input above changes rather than multiplying: pick Whirlwind and it asks for the weapon's figure, pick anything else
and it asks for your total. Increased attack speed and base attack speed are interchangeable for
Whirlwind: it adds the two together with no distinction, so a weapon that grants base attack speed is worth
exactly as much as one granting the same amount of increased attack speed.
Wereforms. Shapeshifting does not give you the form's own frame count.
The engine rescales the rate by the ratio of the form's frames to your human ones, and that factor cancels
against the form's frames, so your breakpoints are the human ones for the weapon you are holding . What
shapeshifting really buys is a higher ceiling: the speed clamp rises from 175 to 250, so attack speed keeps paying
well past the point it stops mattering unshifted.
Skills that break the rule.
Whirlwind ignores the formula above entirely. It measures only the weapon's own
speed, undiminished, as units = FramesPerDirection × 256 ÷ floor(AnimationSpeed × (100 + speed) ÷ 100),
then maps that onto a fixed ladder: 26+ units is 16 frames, then 14, 12, 10, 8, 6, and 11 or fewer units is 4 frames.
It also reads the one-handed animation even for two-handed weapons.
Strafe rewinds the animation after each arrow to
releaseFrame × (100 − Param6) ÷ 100, so every shot after the first only replays the remainder.
ESR uses Param6 = 15 throughout.
Frenzy and charge-up strikes run fixed sequences compiled into the game
rather than a plain animation. Frenzy is 17 steps, swinging on step 4 with the main hand and step 9 with the off
hand; a charge-up is 12 steps with a single strike on step 6. Dual claws do not shorten a charge-up cycle — both
weapons land on the same step, so it hits twice at the same speed.
Who can dual wield. Only the Barbarian and the Assassin. The Assassin pairs
claws and nothing else. The Barbarian pairs any one-handed weapon, and also the two-handed swords marked
1or2handed in weapons.txt — 39 of them, from Two-Handed Sword up to Colossus Blade. A sword held in
one hand switches to its one-handed animation, which is usually faster than the two-handed one.
What the second weapon does. With a weapon in each hand the game averages the two
speed modifiers, (mainWSM + offWSM) ÷ 2, and uses that in place of a single one. Frenzy and charge-up strikes are the skills that
average, because weapsel 3 makes the game alternate hands and each blow is timed on the hand
swinging it. Whirlwind is different. It is weapsel 2, which selects a
single weapon and never averages, so a second weapon cannot shorten the interval — instead both weapons strike
on the same tick, giving two hits per interval. The second one still needs its own target, so against a lone
enemy dual wielding gains nothing.
Base frames and animation speeds are read from this build's animdata.txt; weapon speed modifiers from weapons.txt. Values will not match vanilla calculators where Eastern Sun has changed the underlying tables.