From d82b0648b54a9677abfbafe35584ba655ccf3982 Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 14 May 2026 18:45:17 +0200 Subject: [PATCH] =?UTF-8?q?docs(B.6):=20record=20Slice=201=20trace=20findi?= =?UTF-8?q?ngs=20=E2=80=94=20ACE=20sends=20mtRun=3D0.00,=20no=20UP=20echo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Captured a live ACDREAM_PROBE_AUTOWALK trace double-clicking +Je from ~3.5m. Findings folded into the spec's State at design freeze section: 1. Wire parser is correct (matches ACE MoveToObject.Write + MoveToParameters.Write byte-for-byte). 2. ACE sends mtRun=0.00. Not a parser bug — that's the wire value. Retail's apply_run_to_command (0x00527BE0) fell back to the player's own rate; our Slice 2 needs the same fallback chain. 3. Player position never changed during the entire trace — current behavior is pure no-op on the inbound MoveToObject (literally ignored, as our code at OnLiveMotionUpdated:3289 suggests). 4. ACE does NOT broadcast UpdatePosition for the local player during auto-walk. Definitively kills Option C — nothing to blend with. Local body must drive itself. The trace validates the spec's Option A path. Slice 2 implementation can proceed without further wire-format guessing. --- .../specs/2026-05-14-phase-b6-design.md | 46 +++++++++++++++++-- 1 file changed, 41 insertions(+), 5 deletions(-) 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.