fix(physics): L.2.3d/e/f — wall slide, edge block, step-up diagnostic
Three follow-up fixes from live testing of the L.2.3 step-height pass. L.2.3d — StepUpSlide actually applies the slide Previously SpherePath.StepUpSlide only set ci.SlidingNormal as a flag and returned Slid; the CURRENT step's CheckPos was never adjusted, so the sphere stopped dead at the wall. ValidateTransition's "default to UnitZ" branch then propagated UnitZ into SlidingNormal, overwriting the wall normal entirely. Net effect: stop-at-wall, no horizontal slide. ACE's StepUpSlide (SpherePath.cs:309-317) calls Sphere.SlideSphere which computes the actual slide offset against the contact-plane / wall-normal crease and applies it to CheckPos. acdream already had the same logic in Transition.SlideSphere as a private helper. Exposed as internal SlideSphereInternal; routed StepUpSlide through it. L.2.3e — step-down failure returns Collided (always-on edge block) When walking forward off a balcony / cliff, the step-down probe in TransitionalInsert searches stepDownHeight below CheckPos for a walkable surface. On failure the previous code returned OK, which ValidateTransition accepted — the player walked off the edge anyway, with `RestoreCheckPos` reverting only to the position right after the outer step's offset (still post-edge). Per ACE Transition.cs:268-320 (EdgeSlide), retail's always-on default for OnWalkable + !EdgeSlide-flag movers is to reject the move. Returning Collided here makes ValidateTransition revert CheckPos to CurPos (pre-step), giving the retail-faithful "stop at edge" behavior — both on terrain cliffs and on building/balcony edges. L.2.3f — diagnostic instrumentation for steep-roof investigation GameWindow logs the player's actual StepUpHeight + StepDownHeight at world-entry (along with the raw Setup.* values for comparison) so we can confirm whether the dat-derived value matches retail's spec (~0.4m) or is overriding to something larger. Transition.DoStepUp logs the polygon's collision-normal Z (gated on ACDREAM_DUMP_STEPUP=1 to keep cold-path noise low) so we can tell whether step-up is being triggered against truly-walkable polygons (Z >= FloorZ ≈ 0.66) or whether something steeper is sneaking through. Tests: 825/825 still pass. The L.2 conformance fixtures cover the slide path; D1 + D2 regression tests still pass with the StepUpSlide port. Live verification needed for: - #2 Wall slide: running close to a wall should slide along it. - #4 Edge block: running off a balcony should stop at the edge. - #3 Steep roof: launch with ACDREAM_DUMP_STEPUP=1 and report the "stepup: normal=..." log lines when climbing the offending roof. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
d2f6067960
commit
8fe178ee5c
3 changed files with 71 additions and 10 deletions
|
|
@ -1106,7 +1106,7 @@ public static class BSPQuery
|
|||
if (transition.DoStepUp(collisionNormal, engine!))
|
||||
return TransitionState.OK;
|
||||
|
||||
return transition.SpherePath.StepUpSlide(transition.CollisionInfo);
|
||||
return transition.SpherePath.StepUpSlide(transition);
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue