fix(physics): restore retail edge-response ordering

This commit is contained in:
Erik 2026-07-31 12:55:49 +02:00
parent 4ca7230b36
commit c559c48d80
4 changed files with 525 additions and 180 deletions

View file

@ -1,7 +1,7 @@
# P2 — Collision response-layer edge family: port-ready pseudocode
**Status: RESEARCH PASS COMPLETE (2026-07-30); IMPLEMENTATION PASS PARTIAL
(2026-07-30).** Originally a research-only doc for Campaign P Slice P2
**Status: RESEARCH PASS COMPLETE (2026-07-30); RETAIL RESPONSE ORDER PORTED
(2026-07-31).** Originally a research-only doc for Campaign P Slice P2
(`docs/plans/2026-07-29-physics-parity-campaign.md` §P2); a same-day
implementation session landed TS-1's retirement and AP-7's fix, attempted
TS-4 per this doc's own §6 Step 3 fixture-first order, reproduced the
@ -24,7 +24,10 @@ unreachable from Path 6's unconditional `SetCollide`, which returns
`Adjusted` without repositioning the sphere) and what a future attempt
needs to check first; #116 remains a genuine oracle-first research item
needing live cdb/Ghidra, not an implementation item (see §5). Read §6 (port
order) before starting further implementation on this family.
order) before starting further implementation on this family. Campaign P
Slice 1B subsequently performed that fresh `transitional_insert` read and
removed AP-3, AP-4, AD-53, and AD-54; the exact closeout and controls are in
§8. TS-4 remains deliberately unchanged.
Every claim below is tagged **FACT** (grep/read-verified against the
named-retail decomp, the register, ISSUES.md, or current acdream source
@ -72,12 +75,11 @@ These bind the P2 implementer. Do not re-attempt any of these shapes.
once already (2026-06-12) for the EPSILON-vs-EpsilonSq bug; Ghidra MCP
is DOWN for this research pass — mark any residual x87-ambiguous claim
Ghidra-verify, cite ACE as the fallback tiebreaker, do not silently guess.
9. **AP-4 (CliffSlide check moved before retail's Branch-1 gate)** is a
live, load-bearing reordering compensating for acdream's incomplete
OnWalkable bookkeeping — touches the same code region as TS-1. Do not
revert AP-4's reordering without re-verifying OnWalkable is complete;
read AP-4's full row before changing `TransitionTypes.cs:1316` control
flow.
9. **SUPERSEDED 2026-07-31 by Campaign P Slice 1B.** AP-4's CliffSlide-first
compensation was removed only after the complete retail
`transitional_insert`/`edge_slide` order was read and branch-order plus
graph/flat multi-frame roof/ledge controls passed. Do not reintroduce the
compensation; see §8 and the retired AP-4 row.
10. **TS-46 (two-scalar sphere reconstruction) is OUT OF SCOPE for P2**
(it's P3) but shares files (`TransitionTypes.cs` `InitPath`) — do not
fold TS-46 sphere-list work into a P2 commit.
@ -1066,3 +1068,46 @@ it blocks.
behavior."
---
## 8. Campaign P Slice 1B closeout — exact response ordering (2026-07-31)
The follow-up read used the complete named-retail bodies, not the earlier
excerpt summaries:
- `CTransition::transitional_insert` at `0x0050B6F0`
(pseudo-C:273137 onward) returns `OK_TS` as soon as
`contact_plane_valid != 0`. Only an invalid contact reaches the ordinary
StepDown tail, whose remaining gates are Contact,
`!sphere_path.step_down`, a non-null check cell, and ObjectInfo.StepDown.
- Its StepDown schedule is asymmetric by authored sphere count. For a
one-sphere mover whose requested height exceeds the foot diameter, retail
clamps the probe to half the foot radius and performs one probe. Otherwise
a request within the diameter probes once; an over-diameter request on a
two-sphere mover is halved and probes twice in sequence.
- `CTransition::edge_slide` at `0x0050B3D0`
(pseudo-C:273001-273090) runs `!OnWalkable || !EdgeSlide` restore-and-OK
before its steep-contact CliffSlide branch. Any stored walkable polygon
routes to PrecipiceSlide without a steepness test.
- `CTransition::cliff_slide` at `0x0050A6D0`
(pseudo-C:272397 onward) crosses the supplied contact normal only with
`collision_info.last_known_contact_plane.N`. It has no remembered-walkable
or world-up substitute. A default, invalid, parallel, or otherwise
degenerate cross naturally returns `OK_TS` through the retail normalization
guard.
`TransitionTypes.cs` now follows that order exactly. AP-3, AP-4, AD-53, and
AD-54 are retired together. The implementation deliberately preserves the
existing ordinary-tail `runPlacement: false` choice and does not alter TS-4's
Path-6 steep-polygon shortcut.
`RetailEdgeResponseOrderingTests` pins every distinguishing branch: valid
steep-contact early return, the one/two-sphere probe schedule,
not-OnWalkable-before-CliffSlide, last-known-only source selection, degenerate
last-known handling, and stored-steep-walkable-to-Precipice routing. It also
runs multi-frame steep-roof and flat-roof-edge controls through both parsed
graph and prepared-flat collision traversal, requires exact trace parity, and
rejects a greater-than-15-tick frozen streak. The earlier dedicated
`Ts4SteepRoofWedgeCaptureTests` remains green, so retiring these four
compensations did not require weakening or deleting the TS-4 control.
---