fix #137 (corridor phantom resolved): slide_sphere opposing branch returns Collided; the 'wall' was synthetic
The mechanism-1 theory (PortalSide portal polys solid in our physics set)
is REFUTED for the corridor repro, and the remaining half of the phantom
is fixed — no cdb session needed:
- The live hit normal (-1.00,0.03,-0.03) matches NO dat polygon: a
world-space sweep of both seam cells + every portal-adjacent neighbor
(CorridorSeam_FindPolygonMatchingLiveHit) returns zero candidates. The
normal is the negated movement direction — the SYNTHETIC value
slide_sphere's opposing-normals branch records (reversed = -gDelta).
- Cell 0x8A02016E has IDENTITY rotation (the prior session's 'rotation
maps the portal planes into the -X wall' was a misattribution). The
PortalSide polys to 0x011E are +-Y planes 1.4 m beside the player's
track, perpendicular to the +X run — pos_hits_sphere's directional
cull rejects them for that movement. They ARE referenced by the dat's
physics-BSP leaves (CorridorCell_PhysicsBspLeafMembership), so retail
tests them too when approached into their plane; the dat's
keep-PortalSide / strip-ExactMatch asymmetry reads as intentional
(solid window/grate-class portals). No portal-poly filter — exactly
the blanket-skip the pickup warned against.
- Port fix: CSphere::slide_sphere's opposing-normals branch
(0x005375d7-0x0053762c) records the reversed displacement and returns
COLLIDED_TS; our port returned OK ('retail returns OK here' was a
decomp misread), letting the step complete as-is with the synthetic
collision normal that validate's epilogue then persisted as the
sliding normal the wedge absorbed on. TransitionTypes opposing branch
now returns Collided; pinned by
SlideSphere_OpposingNormals_ReturnsCollided_WithReversedDisplacementNormal
(RED->GREEN).
- Dat-backed replay (Issue137CorridorSeamReplayTests) reproduces the
live hit frame verbatim (same in/out to the millimeter, same 016E->017A
transit, same +8mm settle) and runs the corridor CLEAN: hit=no, no
sliding normal persisted, six further forward frames advance freely.
- Inspection tests extended: physics-BSP leaf membership walk +
hit-normal candidate sweep + downward-poly sweep (all report-style,
dat-gated). Pickup prompt banner'd SUPERSEDED; ISSUES #137 updated
(door half stays open); audit doc extended with the resolution.
Suites: Core 2551 / App 713 / UI 425 / Net 385, 0 failures.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
a11df5b8d3
commit
e8651b3819
7 changed files with 581 additions and 14 deletions
|
|
@ -3730,15 +3730,25 @@ public sealed class Transition
|
|||
return TransitionState.Slid;
|
||||
}
|
||||
|
||||
// Opposing normals: give up, reverse direction.
|
||||
// Retail returns OK here to allow retry with the reversed normal.
|
||||
// Opposing normals (collision normal anti-parallel to the contact
|
||||
// plane, e.g. a ceiling-facing normal while grounded): record the
|
||||
// REVERSED displacement as the collision normal and return COLLIDED.
|
||||
// Retail CSphere::slide_sphere 0x00537440 @0x005375d7-0x0053762c:
|
||||
// `*normal = -gDelta; normalize_check_small; set_collision_normal;
|
||||
// return 2 (COLLIDED_TS)`. #137 (2026-07-06): this previously
|
||||
// returned OK ("to allow retry with the reversed normal" — a decomp
|
||||
// misread), which let the step complete as-is carrying a SYNTHETIC
|
||||
// reversed-movement collision normal — the live corridor hit's
|
||||
// `n=(-1.00,0.03,-0.03)` (= the negated run direction) matched no
|
||||
// dat polygon; validate's epilogue then turned it into a persisted
|
||||
// sliding normal and wedged all forward motion.
|
||||
Vector3 reversed = -gDelta;
|
||||
if (reversed.LengthSquared() > PhysicsGlobals.EpsilonSq)
|
||||
{
|
||||
reversed = Vector3.Normalize(reversed);
|
||||
ci.SetCollisionNormal(reversed);
|
||||
}
|
||||
return TransitionState.OK;
|
||||
return TransitionState.Collided;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue