docs: R5-V1 landed — wiring handoff, register TS-35 correction, #167, roadmap

Housekeeping around the R5-V1 core port (3d89446d):
- r5-wiring-handoff.md: the V2/V3/V4 GameWindow-wiring plan (per-entity
  IPhysicsObjHost, AP-79→voyeur behavioral-equivalence anchor, TS-39 sticky
  integration, mt-0 flags, #164, facade). These are the visual-gated slices.
- ISSUES #167: ConstraintManager leash unported — arming (SmartBox) + two
  x87 distance constants BN elided; deferred (needs cdb/Ghidra). TS-35 stays.
- Register TS-35 corrected: R5 recon proved the "write side" is the
  ConstraintManager server-position rubber-band leash, NOT the earlier
  "per-cell contact-plane / doorway-jamming" guess. Oracle addresses fixed.
- Roadmap Phase R: R5-V1 shipped, R2-R4 visual pass PASSED, next = wiring.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-07-03 19:42:04 +02:00
parent 3d89446d98
commit 2b5e8a6738
4 changed files with 181 additions and 4 deletions

View file

@ -46,6 +46,44 @@ Copy this block when adding a new issue:
---
## #167 — ConstraintManager leash unported (arming + two unknown x87 constants)
**Status:** OPEN (deferred, filed 2026-07-03 during R5-V1)
**Severity:** LOW (server-position rubber-band + jump-during-rubber-band gate)
**Component:** physics, constraint
**Description:** R5-V1 ported `ConstraintManager` (the server-position
rubber-band leash) as a Core class for structural completeness of
`PositionManager`, but it is never ARMED in acdream. Retail arms the leash
ONLY from `SmartBox::HandleReceivedPosition` (0x00453fd0) — on every inbound
server position packet, anchoring the mover to self (remotes) or the received
position (player) — with a start/max distance band from
`CPhysicsObj::GetStartConstraintDistance` (0x0050ebc0) and
`GetMaxConstraintDistance` (0x0050ec10). acdream's position reconciliation is
not `SmartBox`, so nothing calls `PositionManager.ConstrainTo`, and
`IsFullyConstrained` stays false (= register **TS-35**'s current stub
behavior — jump never blocked by the leash).
**Blockers:** (1) the two distance constants are **x87 float returns BN
elided** — `GetStart/MaxConstraintDistance` decompile to a bare
`this->m_position;` expression with the actual returned value lost to the
FPU-return-elision artifact. Recovering them needs a live cdb read of `st0`
after the call (retail debugger toolchain) or a Ghidra re-decompile with a
corrected float-return signature. (2) The arming site (`SmartBox`'s inbound
position-reconciliation branches A/B/C) has no acdream equivalent yet — wiring
it means teaching acdream's position path to re-anchor the leash on every
server position update, then feeding the `adjust_offset` taper into the body
integration (same chokepoint as the sticky wiring, R5-V3).
**Where:** `src/AcDream.Core/Physics/Motion/ConstraintManager.cs` (class,
unarmed); the read gate is `PhysicsBody.IsFullyConstrained` (TS-35) via
`jump_is_allowed`. Decomp: `docs/research/2026-07-03-r5-managers/`.
**Acceptance:** the two constants are recovered (cdb/Ghidra), acdream arms the
leash on inbound server positions, `IsFullyConstrained` fires while
rubber-banding, and a jump attempt inside the tight leash is blocked
(0x47) matching retail; TS-35 + this issue retire together.
## #160 — Remote moveto: run animation pace vs actual movement speed mismatch
**Status:** CLOSED (2026-07-03, `41006e79`, user-verified same session).