feat(R3-W3): verbatim jump family — charge gates, jump_is_allowed chain, epsilon fixes; StandingLongJump misattribution retired (closes J5, J6, J7-interp-side, J16-epsilons)
JumpChargeIsAllowed 0x00527a50 (CanJump→0x49 before posture; Fallen + Crouch..Sleeping→0x48), ChargeJump 0x005281c0 — now the ONLY place standing_longjump arms (grounded Contact+OnWalkable + forward Ready + no sidestep/turn, raw @305453-305466); the S2a-flagged side effect inside contact_allows_move is DELETED (J6) with regression pins that contact checks never touch the flag (the funnel's StandingLongJump branch is local-player scope; the controller wires ChargeJump in W4/W6 — remotes never charge client-side, no interim regression). jump_is_allowed 0x005282b0 full chain replaces the 15-line approximation: IsFullyConstrained→0x47 (new PhysicsBody stub, TS-35) BEFORE the pending-head peek (A2 ordering, pinned); head peek fires whenever the queue is non-empty (no ACE Count>1 gate; nonzero jump_error_code short-circuits the whole chain — test proves JumpStaminaCost is never consulted); retail entry shape verbatim (non-creature-weenie and gravity-off skip the ground gate; null physics obj → 0x24 NOT 8 per A10); charge → MotionAllowsJump(fwd) double-check → JumpStaminaCost gate (new IWeenieObject member, always-affordable PlayerWeenie stub — TS-5 extended). GetJumpVZ/GetLeaveGroundVelocity: epsilon corrected to retail's 0.000199999995f (was 0.001 — regression-pinned at extent 0.0005); A5 shape (clamp 1.0, weenie-null 10.0f); A6 momentum fallback fires only when ALL THREE components are sub-epsilon and overwrites all three with global→local(m_velocityVector). Jump 0x00528780: InterruptCurrentMovement no-op seam (TS-36, →R4 cancel_moveto), fires unconditionally; standing_longjump cleared ONLY on failure (success keeps it — pinned). IWeenieObject.IsThePlayer() (PlayerWeenie true) lands for W4's A3 dispatch. 51 new tests + 1 re-pin; superseded pre-W3 jump tests removed. Full suite: 3,623 passed. Registers: TS-5 extended, TS-35/36/37 added. Implemented by a dedicated agent against the W0-pinned spec; arming gates + entry shape verified against the quoted raw text. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
371679915e
commit
af4764443f
7 changed files with 1383 additions and 352 deletions
|
|
@ -231,6 +231,20 @@ public sealed class PhysicsBody
|
|||
/// <summary>Last simulation time used to compute dt (+0xD8).</summary>
|
||||
public double LastUpdateTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// R3-W3 stub for retail <c>CPhysicsObj::IsFullyConstrained</c>
|
||||
/// (0x0050f730), read by <c>CMotionInterp::jump_is_allowed</c> (raw
|
||||
/// 305524-305525: <c>if (IsFullyConstrained(physics_obj) != 0) return
|
||||
/// 0x47;</c>). Retail's body walks per-cell contact-plane constraints
|
||||
/// (a mover pinned between opposing walkable surfaces / doorway
|
||||
/// jamming); acdream has no equivalent constraint-tracking yet.
|
||||
/// Register row: stubbed false (never fires) — a real port needs the
|
||||
/// per-cell shadow-list contact accounting the physics digest tracks.
|
||||
/// See docs/architecture/retail-divergence-register.md (added same
|
||||
/// commit as this field).
|
||||
/// </summary>
|
||||
public bool IsFullyConstrained { get; set; }
|
||||
|
||||
// ── convenience helpers ────────────────────────────────────────────────
|
||||
|
||||
public bool HasGravity => State.HasFlag(PhysicsStateFlags.Gravity);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue