fix(physics): movement-parity fixes - adjusted catch-up cap, autorun retail semantics, AP-30 retired
Ports CMotionInterp::get_adjusted_max_speed (0x00527D00, byte-decoded: bare rate unless RunForward; forward_speed x 4.0 when running; current_speed_factor proven a ctor-constant 1.0 at 0x00528C34) and swaps all five interpolation catch-up call sites to it - retail's fUseAdjustedSpeed_ static (.data 0x0081F418 = 1) makes this the live branch, so standing/walking remotes now catch up at ~2x runRate instead of 4x too fast (the #41/#165 presentation family). Autorun now hard- forces Run for its duration and cancels on every fresh forward press (CommandInterpreter::HandleNewForwardMovement 0x006b3d60 is literally SetAutoRun(0,1)); the old test pin codified the divergence. AP-30 retired: retail Frame::is_equal genuinely uses the 0.0002 epsilon - the row recorded a non-divergence. Three catch-up test pins re-baselined to retail semantics with citations. Full Release suite 9,983/0. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
2123b44e8c
commit
c0afcacbb2
10 changed files with 174 additions and 32 deletions
|
|
@ -68,7 +68,13 @@ internal sealed class DispatcherMovementInputSource : IMovementInputSource
|
|||
StrafeRight: dispatcher.IsActionHeld(InputAction.MovementStrafeRight),
|
||||
TurnLeft: dispatcher.IsActionHeld(InputAction.MovementTurnLeft),
|
||||
TurnRight: dispatcher.IsActionHeld(InputAction.MovementTurnRight),
|
||||
Run: !walking,
|
||||
// Movement parity audit (2026-07-30): retail's autorun hard-forces
|
||||
// Run for its whole duration (ACCmdInterp autorun dispatch always
|
||||
// sends RunForward-class state); the live walk/run toggle only
|
||||
// applies to ordinary held-key movement. Recomputing `!walking`
|
||||
// unconditionally let a walk-mode toggle demote an active autorun
|
||||
// to walking — impossible in retail.
|
||||
Run: !walking || AutoRunActive,
|
||||
Jump: dispatcher.IsActionHeld(InputAction.MovementJump));
|
||||
}
|
||||
|
||||
|
|
@ -84,7 +90,12 @@ internal sealed class DispatcherMovementInputSource : IMovementInputSource
|
|||
AcDream.Runtime.RuntimeMovementCommand.ToggleRunLock);
|
||||
|
||||
if (AutoRunActive && action is (
|
||||
InputAction.MovementBackup
|
||||
// Movement parity audit (2026-07-30): retail's
|
||||
// ACCmdInterp::HandleNewForwardMovement drops autorun on EVERY
|
||||
// fresh forward press edge, not only on backward/stop/strafe —
|
||||
// a new W press while autorunning hands control back to the key.
|
||||
InputAction.MovementForward
|
||||
or InputAction.MovementBackup
|
||||
or InputAction.MovementStop
|
||||
or InputAction.MovementStrafeLeft
|
||||
or InputAction.MovementStrafeRight))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue