docs #137: corridor phantom characterized — PortalSide polys solid + sliding-normal wedge
Facility Hub corridor repro (probe + dat evidence, both mechanisms
pinned):
1. PortalSide portal polygons live IN CellStruct.PhysicsPolygons and
acdream collides with them as plain solid geometry. Cell
0x8A02016E's portals to 0x011E (polys 1/3/5, flags=PortalSide) are
present in the physics set while every ExactMatch portal in the
same cell is absent — the cell's rotation maps those portal planes
to the world -X wall the player hit mid-corridor
(launch-175-verify2.log:42858, n=(-1,0,0)). Retail must honor the
portal side; oracle grep required before fixing.
2. After the single seam hit, the body-persisted SlidingNormal
projects every subsequent forward offset to exactly zero in
AdjustOffset - the step aborts BEFORE any collision test can
update state (ok=False hit=no, zero advance), an absorbing wedge
escaped only by strafing ("push through on the side"). The #116
slide-response family: retail re-derives slide state per frame
(get_object_info pc:279992).
Inspection fixture: Issue137CorridorSeamInspectionTests (dumps
physics-vs-portal polygon membership for the two corridor cells).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
bb18614a89
commit
17ce23ce38
2 changed files with 116 additions and 9 deletions
|
|
@ -1183,15 +1183,32 @@ walls** in particular. (Symptoms not fully characterized yet: likely walking thr
|
|||
openings that should block / blocking at openings that should pass, and door collision not
|
||||
matching the door's open/closed state.)
|
||||
|
||||
**Root cause / status (to investigate):** dungeon collision is EnvCell-based — the cell's
|
||||
collision BSP + portal openings + per-cell static objects (doors). Candidates: door
|
||||
apparatus collision in EnvCells (open/closed BSP swap) not fully ported; portal-opening
|
||||
(wall gap) collision geometry handled differently from buildings; the per-cell
|
||||
shadow-object registration (A6.P4, see the physics digest) for dungeon EnvCell statics.
|
||||
Related families: #32 (edge-slide), #116 (slide-response), the door-collision saga
|
||||
(see `feedback_dedup_keys_after_cardinality_change`, `feedback_retail_per_cell_shadow_list`).
|
||||
Needs a targeted repro (which door / which opening, expected vs actual) before fixing —
|
||||
oracle-first per the physics digest.
|
||||
**CHARACTERIZED 2026-07-05 (Facility Hub corridor repro, probe + dat evidence)
|
||||
— two stacked mechanisms:**
|
||||
1. **PortalSide portal polygons are IN the physics polygon set and we treat
|
||||
them as solid.** Live: running the corridor, the seam crossing
|
||||
`0x8A02016E → 0x8A02017A` (x≈85.25) records a wall hit with normal
|
||||
(−1,0,0) — straight against the movement (`launch-175-verify2.log:42858`).
|
||||
Dat (`Issue137CorridorSeamInspectionTests`): cell 0x8A02016E's portals to
|
||||
0x011E (polys 1/3/5, flags=**PortalSide**, no ExactMatch) are PRESENT in
|
||||
`CellStruct.PhysicsPolygons` — every ExactMatch portal in the same cell is
|
||||
absent from the physics set. The cell's rotation maps those local ±Y portal
|
||||
planes to world ±X — the phantom mid-corridor wall. Retail must honor the
|
||||
portal's SIDE (pass from one side / solid from the other, or pass when the
|
||||
neighbor is loaded); we collide with the raw polygon unconditionally.
|
||||
**Oracle next (MANDATORY before fixing):** grep named-retail for how
|
||||
BSPTREE::find_collisions / CEnvCell treats portal-flagged physics polys
|
||||
(portal_side semantics; the prep note "portal passability comes from BSP
|
||||
structure" was true for ExactMatch portals only).
|
||||
2. **The stale sliding normal then wedges all forward motion** (the #116
|
||||
slide-response family): after the single seam hit, EVERY subsequent
|
||||
forward resolve returns `ok=False hit=no` with zero advance — the
|
||||
body-persisted SlidingNormal (−1,0,0) projects the +X offset to exactly
|
||||
zero in AdjustOffset, aborting at step 0 BEFORE any collision test could
|
||||
update the state — an ABSORBING wedge escaped only by strafing ("push
|
||||
through on the side"). Retail re-derives slide state per frame
|
||||
(get_object_info pc:279992 governs only the NEXT frame — #116 notes);
|
||||
audit who clears the body's sliding normal when no contact recurs.
|
||||
|
||||
**Files:** `src/AcDream.Core/Physics/` (EnvCell collision, CellTransit, the door apparatus),
|
||||
`src/AcDream.Core/Physics/ShadowObjectRegistry.cs` (per-cell registration). See
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue