diff --git a/src/AcDream.App/Rendering/GameWindow.cs b/src/AcDream.App/Rendering/GameWindow.cs index 7eb151c..588e448 100644 --- a/src/AcDream.App/Rendering/GameWindow.cs +++ b/src/AcDream.App/Rendering/GameWindow.cs @@ -3491,12 +3491,14 @@ public sealed class GameWindow : IDisposable // velocity here. Preserve the sign — SideStepLeft is sometimes // emitted with negative speedMod by the adjust_motion path. // - // Magnitude: horizSpeed / WalkAnimSpeed maps the observed speed - // back to a speedMod the sequencer can apply as a framerate - // multiplier. WalkAnimSpeed is the reasonable base because - // sidestep cycles use the WalkAnim equivalent (no separate - // RunSidestep cycle in the dat). - float sideMag = horizSpeed / AcDream.Core.Physics.MotionInterpreter.WalkAnimSpeed; + // Magnitude: horizSpeed / SidestepAnimSpeed maps the observed + // speed back to a SideStepSpeed the sequencer can apply as a + // framerate multiplier. Retail's get_state_velocity for + // sidestep cycles is `velocity.X = SidestepAnimSpeed * + // SideStepSpeed` (MotionInterpreter.cs:592 — constant 1.25 + // m/s). Dividing by WalkAnimSpeed (3.12) here was wrong by + // 2.5× and made slow strafe play visibly slower than retail. + float sideMag = horizSpeed / AcDream.Core.Physics.MotionInterpreter.SidestepAnimSpeed; sideMag = MathF.Min(MathF.Max( sideMag, AcDream.Core.Physics.ServerControlledLocomotion.MinSpeedMod),