acdream/src/AcDream.Core/Physics
Erik db2889afda fix(physics): #116 shape-1 — Path-6 head-sphere direct Collided return
Per docs/research/2026-07-30-ts4-116-oracle-plan.md §2.3-§2.4: retail's
airborne (not-yet-Contact) BSPTREE::find_collisions dispatch, when the
FOOT sphere is completely clear but the HEAD sphere hits or near-misses,
does not defer through SetCollide/Adjusted (nor the steep-poly
slide-tangent shortcut) — it records the head polygon's normal directly
and hard-stops: pc:323824-323834 (0x0053a793/0x0053a7a4), independently
cross-checked against ACE BSPTree.cs:221-230 (`SetCollisionNormal` +
`return TransitionState.Collided;`), an exact structural match confirming
this isn't a BN misdecompile. BSPQuery.cs's Path 6 `hasSphere1` branch now
does the same: `collisions.SetCollisionNormal(worldNormal1); return
TransitionState.Collided;`, replacing the old steep-shortcut-or-deferred-
SetCollide handling. This mechanically retires one of TS-4's two
`SetSlidingNormal` write sites (sphere1's) ahead of TS-4's own item.

Added two permanent diagnostics gated on the existing
PhysicsDiagnostics.ProbeIndoorBspEnabled flag (`[path-dispatch]` at
FindCollisionsCore entry, `[path5-diag]` inside Path 5) to make future
BSPQuery dispatch tracing cheaper.

HONEST RESULT of the plan's own confirming instrumentation (re-run of
DoorBugTrajectoryReplayTests.Diagnostic_Tick22760_DumpEngineInternals):
this fix does NOT change the tick-22760 outcome (harness still cn=(0,0,1)
vs live cn=(0,+1,0)). The new dispatch-entry probes show the tick-22760
mover is GROUNDED (Contact set), so it never reaches Path 6 at all — it
dispatches Path 5 -> StepSphereDown (Path 3, both DoStepDown half-steps
fail) -> EdgeSlideAfterStepDownFailed -> SpherePath.PrecipiceSlide, whose
find_crossed_edge-false fallback returns Collided with NO collision-normal
write. A fresh byte-level read of retail's SPHEREPATH::precipice_slide
(pc:274316-274326, 0x0050cc80) confirms this is byte-exact retail
behavior (`if (eax == 0) { walkable = 0; return 2; }`, no
set_collision_normal call) — not a bug. The real tick-22760 divergence is
further upstream, most likely this test's simplified door registration
(BuildEngineWithDoorFixture) not placing the door's BSP where live retail
actually intersected it, or a walkable-polygon state-capture gap — see
the research doc's Addendum 2 for the full trace and open candidates.

#116 shape-1 is therefore NARROWED, not closed: the Path-6 fix is a real,
independent retail-faithfulness improvement; the tick-22760 acceptance
criterion is not met by it and needs further harness/geometry work before
any further code change.

Full AcDream.Core.Tests suite: 4059 passed / 2 skipped, no regressions.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 12:36:26 +02:00
..
Motion fix(physics): P5 commit 3 - retire TS-35, close #167 (ConstraintManager leash) 2026-07-30 12:12:29 +02:00
AceModernCommandCatalog.cs feat(L.1b): dual MotionCommand catalog — AceModern runtime + Retail2013 conformance 2026-06-30 22:13:36 +02:00
AnimationCommandRouter.cs fix(anim): Phase L.1b route motion commands 2026-04-28 10:46:22 +02:00
AnimationHookRouter.cs feat(anim): Phase E.1 hook router + GameWindow wiring 2026-04-18 16:30:23 +02:00
AnimationSequencer.cs fix(animation): harden presentation phase handoffs 2026-07-21 10:01:25 +02:00
BSPQuery.cs fix(physics): #116 shape-1 — Path-6 head-sphere direct Collided return 2026-07-30 12:36:26 +02:00
BuildingPhysics.cs T6 (BR-7) C3: per-cell shadow architecture - flood registration, building channel, per-cell query; b3ce505 stopgap DELETED (closes #99) 2026-06-11 14:37:50 +02:00
CellArray.cs feat(physics): Stage 1 — CellArray ordered/deduped cell collection (retail CELLARRAY) 2026-06-03 08:54:45 +02:00
CellDump.cs feat(phys): A6.P3 #98 Step 2 — cell-dump probe + roundtrip test 2026-05-23 15:16:56 +02:00
CellSurface.cs refactor(physics): remove parsed collision graphs 2026-07-25 18:21:19 +02:00
CellTransit.cs fix(physics): traverse prepared indoor portal topology 2026-07-27 00:02:44 +02:00
CollisionExemption.cs fix(physics): #137 Task 3 — port obstruction_ethereal verbatim; retire AD-7 shim 2026-06-24 19:20:02 +02:00
CollisionPrimitives.cs feat(physics): Task 2 — true sphere collision primitive (CSphere::intersects_sphere) 2026-06-24 19:08:53 +02:00
CollisionShadowVerifier.cs perf(physics): cut production traversal to flat assets 2026-07-25 17:00:04 +02:00
CollisionTraversal.cs refactor(physics): remove parsed collision graphs 2026-07-25 18:21:19 +02:00
EncumbranceSystem.cs feat(physics): Campaign P P1 - stat-coupled movement (burden/stamina/vitae) 2026-07-30 08:18:06 +02:00
EntityCollisionFlags.cs fix(physics): AP-71 - port check_entry_restrictions at the head of indoor FindEnvCollisions 2026-07-30 10:30:45 +02:00
FlatBspQuery.cs feat(physics): add differential flat BSP traversal 2026-07-25 15:47:58 +02:00
FlatCollisionAssetBuilder.cs feat(content): bake and read flat collision assets 2026-07-25 15:22:08 +02:00
FlatCollisionAssets.cs perf(physics): cut production traversal to flat assets 2026-07-25 17:00:04 +02:00
GfxObjDump.cs feat(phys): A6.P3 #98 — GfxObj dump infrastructure (ACDREAM_DUMP_GFXOBJS) 2026-05-23 20:24:26 +02:00
IAnimationHookSink.cs feat(#188): fading-wall + sliding-door translucency; hold open past animation settle 2026-07-09 09:17:50 +02:00
IMotionCommandCatalog.cs feat(L.1b): dual MotionCommand catalog — AceModern runtime + Retail2013 conformance 2026-06-30 22:13:36 +02:00
InterpolationManager.cs feat(physics): port retail complete object frame pipeline 2026-07-20 09:10:31 +02:00
InterpretedMotionFunnel.cs fix(R4-V5): moveto wedge - StopCompletely's missing animation dispatch orphaned pending_motions; + the P1 autonomous store family 2026-07-03 14:15:36 +02:00
LandDefs.cs feat(physics #145): Slice 1 — Position/Frame types + LandDefs.GetBlockOffset (0x0043e630) 2026-06-21 10:30:20 +02:00
MotionCommandResolver.cs feat(L.1b): dual MotionCommand catalog — AceModern runtime + Retail2013 conformance 2026-06-30 22:13:36 +02:00
MotionInterpreter.cs feat(core): adopt retail's full WeenieError code table 2026-07-29 07:33:27 +02:00
MovementSystem.cs fix(physics): TS-23 - plumb real PK/PKLite/Impenetrable mover flags 2026-07-30 09:52:55 +02:00
ObjectRangeMath.cs fix(items): use retail cylinder range for loot windows 2026-07-17 20:32:34 +02:00
PhysicsBody.cs fix(physics): P5 commit 3 - retire TS-35, close #167 (ConstraintManager leash) 2026-07-30 12:12:29 +02:00
PhysicsDataCache.cs fix(physics): AP-71 - port check_entry_restrictions at the head of indoor FindEnvCollisions 2026-07-30 10:30:45 +02:00
PhysicsDiagnostics.cs feat(streaming): shadow-publish flat collision assets 2026-07-25 16:38:54 +02:00
PhysicsEngine.cs fix(physics): AP-129 review fix - port CanMoveInto/IsAllowedIn, stop failing closed 2026-07-30 11:36:11 +02:00
PhysicsObjUpdate.cs fix(physics): AP-10 - restore retail's 0.1m dry-corner water sink-in; wire WATER_CONTACT_TS 2026-07-30 10:52:39 +02:00
PhysicsResolveCapture.cs test: fix PhysicsResolveCapture/PhysicsDiagnostics static-leak isolation 2026-06-02 15:20:24 +02:00
PhysicsTimestampGate.cs feat(net): port retail physics spawn and event timestamps 2026-07-14 00:22:17 +02:00
PlayerWeenie.cs fix(physics): TS-23 - plumb real PK/PKLite/Impenetrable mover flags 2026-07-30 09:52:55 +02:00
PortalInfo.cs feat(physics): Phase 2 — wire CellBSP + Portals into CellPhysics 2026-05-19 16:52:20 +02:00
PortalPlane.cs fix(core): Phase B.3 — add centroid + radius bounds to PortalPlane crossing test 2026-04-12 19:08:46 +02:00
Position.cs refactor(physics #145): Slice 1 — rename Frame->CellFrame to avoid DatReaderWriter.Types.Frame collision 2026-06-21 10:34:36 +02:00
PositionFrameValidation.cs feat(net): port retail physics spawn and event timestamps 2026-07-14 00:22:17 +02:00
ProjectilePhysicsStepper.cs feat(physics): port retail complete object frame pipeline 2026-07-20 09:10:31 +02:00
RawMotionState.cs feat(R3-W1): retail state completion — action FIFOs, MovementParameters, MotionNode, WeenieError renumber (closes J2, J16-codes) 2026-07-02 22:12:33 +02:00
RemoteMotionCombiner.cs feat(physics): port retail complete object frame pipeline 2026-07-20 09:10:31 +02:00
RemoteWeenie.cs fix(R4-V5): #160 remote run movetos in slow motion - remote interps had no weenie, so retail's run-rate chain never reached my_run_rate 2026-07-03 16:18:40 +02:00
ResolveResult.cs refactor(runtime): own local movement and outbound cadence 2026-07-26 12:33:53 +02:00
Retail2013CommandCatalog.cs feat(L.1b): dual MotionCommand catalog — AceModern runtime + Retail2013 conformance 2026-06-30 22:13:36 +02:00
RetailFrameMath.cs feat(physics): port retail projectile integration 2026-07-14 11:43:11 +02:00
RetailObjectActivityGate.cs feat(physics): port retail complete object frame pipeline 2026-07-20 09:10:31 +02:00
RetailObjectManagerTail.cs feat(physics): port retail complete object frame pipeline 2026-07-20 09:10:31 +02:00
RetailObjectQuantumClock.cs feat(physics): port retail complete object frame pipeline 2026-07-20 09:10:31 +02:00
RetailPhysicsStateTransition.cs feat(vfx): port retail hidden and teleport presentation 2026-07-14 14:59:48 +02:00
ServerControlledLocomotion.cs fix(combat): persist death and retarget on kill 2026-07-12 09:19:38 +02:00
ShadowEntrySnapshot.cs perf(physics): pool collision cell snapshots 2026-07-23 06:12:34 +02:00
ShadowObjectRegistry.cs refactor(runtime): close simulation ownership 2026-07-26 15:53:31 +02:00
ShadowShape.cs feat(phys): add ShadowShape record (no callers yet) 2026-05-24 15:07:40 +02:00
ShadowShapeBuilder.cs perf(physics): cut production traversal to flat assets 2026-07-25 17:00:04 +02:00
TerrainSurface.cs fix(physics): AP-10 - restore retail's 0.1m dry-corner water sink-in; wire WATER_CONTACT_TS 2026-07-30 10:52:39 +02:00
TransitionScratchArena.cs perf(physics): reuse reset-complete transition scratch 2026-07-25 14:37:02 +02:00
TransitionTypes.cs fix(physics): TransitionalInsert returns the real exhausted-retry state 2026-07-30 12:36:05 +02:00
WalkMissDiagnostic.cs feat(physics): WalkMissDiagnostic aggregator for ISSUES #83 probe spike 2026-05-20 10:31:39 +02:00
WeenieError.cs feat(core): adopt retail's full WeenieError code table 2026-07-29 07:33:27 +02:00