diff --git a/docs/superpowers/specs/2026-05-14-phase-b6-design.md b/docs/superpowers/specs/2026-05-14-phase-b6-design.md index f6e03bc..02a5fbc 100644 --- a/docs/superpowers/specs/2026-05-14-phase-b6-design.md +++ b/docs/superpowers/specs/2026-05-14-phase-b6-design.md @@ -379,8 +379,44 @@ infrastructure. `CPhysicsObj::MoveToObject` on the local player's body. Option C (server-position-blend) is not retail-faithful and is no longer considered. -- **Next session entry point:** Slice 1 — add the - `ACDREAM_PROBE_AUTOWALK` diagnostic as the baseline, run a failed - auto-walk reproduction for a clean trace, then proceed to Slice 2 - (`PlayerMovementController.BeginServerAutoWalk` + `RemoteMoveToDriver` - reuse for the local player). +- **Slice 1 shipped 2026-05-14** (`eda8278` + `1b4f3ba`): + `ACDREAM_PROBE_AUTOWALK` diagnostic + DebugPanel checkbox. + +### Trace-captured findings (post-Slice-1) + +A live trace captured at Holtburg with the probe enabled — +double-clicking `+Je` (a remote player at `(111.34, 5.96, 94.01)` in +cell `0xA9B40021`) from ~3.5 m away, 4 successive Use sends. Findings: + +1. **Parser confirmed correct.** Each `[autowalk-mt]` line reads + `mt=0x06 isMoveTo=True moveTowards=True + path=cell=0xA9B40021,xyz=(111.34,5.96,94.01),minDist=0.00,objDist=0.50 + mtSpd=1.00 mtRun=0.00`. Matches ACE's + `MoveToObject.Write` + `MoveToParameters.Write` byte-for-byte. +2. **ACE sends `mtRun=0.00`** — not a parser bug. ACE's + `Player_Move.MoveTo` default for unspecified `runRate` is `0.0f`, + and the call into MoveToObject uses that wire value directly. Retail + decomp at `0x005245e9` copies the wire value into + `motion_interpreter->my_run_rate`; if 0, the local MoveToManager + falls back to the player's own run-rate via + `CMotionInterp::apply_run_to_command` (`0x00527BE0`). +3. **Player position never changed** during the entire trace. All + `[autowalk-up]` lines after the 4 Use sends report + `pos=(112.32, 9.36, 94.00)` verbatim — current behavior is pure + no-op on the inbound MoveToObject. +4. **ACE does NOT broadcast `UpdatePosition` for the local player + during the auto-walk.** This kills Option C even more firmly than + the retail decomp did. The local body has to drive itself. +5. **Slice 2 must handle `mtRun == 0.0`** — fall back to the player's + own current run rate. The trace also captured `fwdSpd=2.86` for + the user's normal running before the auto-walk attempt — that's + the server-echoed `ForwardSpeed`, available as a recent-history + source for the fallback. Default `1.0` if no echo yet. + +### Next session entry point + +Slice 2: add `PlayerMovementController.BeginServerAutoWalk` / +`EndServerAutoWalk` + per-tick steering via `RemoteMoveToDriver`-style +heading + arrival. Wire in `GameWindow.OnLiveMotionUpdated` with the +`mtRun=0` fallback chain. Suppress user-input motion while +auto-walking; cancel on movement-key press.