acdream/tests/AcDream.Core.Tests/Physics
Erik ddb5a96799 feat(#184): Slice 2b — unify the remote player/NPC fork (players collide faithfully)
Collapse the two-path fork in RemotePhysicsUpdater.Tick: the former Path A
(grounded PLAYER remotes advanced by the interp catch-up with ResolveWithTransition
deliberately OMITTED, per the now-retired issue-#40 premise) is gone. Every remote --
player and NPC -- now runs the SAME per-tick catch-up + sweep + shadow-follows-resolved.
Retail's UpdateObjectInternal (0x005156b0) has no player/remote fork; this is the
faithful shape. Player remotes now get terrain-Z snap (no slope staircase), wall
collision, and MONSTER collision -- previously (Path A) they skipped ALL collision.

RETAIL PvP (adversarial review caught this): two non-PK players WALK THROUGH each
other in AC (you can stand inside another non-PK player) -- they do NOT de-overlap.
The remote-player mover now carries IsPlayer|EdgeSlide (mirroring the LOCAL player at
PlayerMovementController), so CollisionExemption's PvP block exempts a non-PK pair,
exactly as retail sets IsPlayer on every object's own transition (OBJECTINFO::init
0x0050cf30) and FindObjCollisions (pc:276812) exempts it. The first 2b draft passed
bare EdgeSlide and de-overlapped players (MORE solid than retail); the 3-lens review
flagged it. PK/PKLite/Impenetrable are not plumbed onto the remote mover yet -- the
same M1.5 gap the local player carries (TS-23, extended).

#40 proven dead in code (before the gate): PlayerVsMonster_DeOverlapsAndAbsorbsTheStallBlip
drives the real ComputeOffset -> InterpolationManager catch-up (incl. the fail_count
blip-to-tail) for a player mover converging on a monster and asserts de-overlap +
maxSpike<0.30 -- the sweep absorbs the stall-blip. ConvergingPlayers_WalkThroughEachOther
proves the PvP exemption (non-PK players pass through). Path B already ran the
#40-feared config stably; #40 (May 2026) predates the CSphere/#137/#170/#171 rebuild.

Placement (HIGH, review finding 3): the player UP routing gains the SAME placement-snap
backstop Slice 1 gave NPCs (AP-87). Without it a UM-first player (RemoteMotion seeded
to the spawn pos, then a first UP in a different cell) would sweep from a stale cell ->
garbage -> the digest's invisible/misplaced-player bug. The 4 m bodyToTarget guard +
!willBeDrTicked + dist>96 snap; near placed corrections still enqueue for smooth
catch-up. Also seed Body.Position=worldPos at UP-handler RemoteMotion creation
(mirrors the UM handler :5176) for the UP-first case.

Coupled shadow edits (research finding 9): RETIRED the players-only raw-worldPos shadow
sync -- now that players run the sweep + shadow-follows-resolved, the raw sync would
re-snap a packed player's shadow into overlap each UP. Player shadows follow the
RESOLVED body via the DR-tick loop + a new player UP-branch-tail SyncRemoteShadowToBody.

Surviving player/NPC split (AP-88): the omega -- grounded PLAYERS keep the
ObservedOmega-or-seqOmega world-frame (Concatenate) fallback ("rectangle when running
circles"); NPCs + airborne keep ObservedOmega-only body-frame (Multiply). They commute
for an upright body + yaw omega, so the fork is faithful.

Register: TS-23 extended (remote-player mover PK gap); AP-86 updated (raw sync retired
for players too, Where column fixed); AP-88 added (omega fork + eval-order note).

Tests: Core 2623 / App 741 green, 0 warnings. 3-lens adversarial review + per-finding
verification (10 agents); all 6 confirmed findings addressed (2 substantive: PvP mover
flags + player placement-snap; 4 doc/cosmetic).

VISUAL GATE (acceptance test) owed by the user -- NOTE the corrected expectation:
  (a) a player remote on a hill -- no slope staircase;
  (b) two packed player remotes -- they WALK THROUGH each other (retail PvP), NOT
      de-overlap (this corrects the design's original "players de-overlap" gate);
  (c) a player remote cannot stand inside a MONSTER (new: player-vs-monster collision);
  (d) remote walk/run/jump/land/turn UNCHANGED.

Handoff: docs/research/2026-07-07-184-slice2-unify-extract-handoff.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 00:45:44 +02:00
..
Motion fix #174: RemoveLinkAnimations seam is HandleEnterWorld (strip + drain) 2026-07-05 16:33:41 +02:00
A6P7DispatchRulesTests.cs feat(physics): D4+W1 — entry-restrictions register row + named PvP/missile dispatch terms 2026-06-24 19:45:39 +02:00
AnimationCommandRouterTests.cs feat(R2-Q4): adapter cutover — SetCycle/PlayAction rehosted on PerformMovement; Fix B / fast-path / stop-anim fallback / G17 gate DELETED 2026-07-02 21:41:27 +02:00
AnimationHookRouterTests.cs feat(anim): Phase E.1 hook router + GameWindow wiring 2026-04-18 16:30:23 +02:00
AnimationSequencerCutoverTraceTests.cs feat(R3-W4): ground transitions + lifecycle verbatim; K-fix18 DELETED (closes J8, J10, J11-shape, J12, J13, J18, J19) 2026-07-02 23:01:31 +02:00
AnimationSequencerTests.cs feat(R2-Q5): RemoteMotionSink DELETED — funnel dispatches straight into PerformMovement; AP-73 retired 2026-07-02 21:55:13 +02:00
BSPQueryTests.cs fix #137 (mechanism 2): BSP full-hit stubs leaked sliding normals — the corridor absorbing wedge 2026-07-05 18:08:29 +02:00
BSPStepUpFixtures.cs feat(physics): Phase L.2.1+L.2.2 — BSP step-up and rooftop landing 2026-04-29 16:16:39 +02:00
BSPStepUpTests.cs fix #116 (partial, Ghidra-confirmed): slide_sphere degenerate guard uses F_EPSILON, not EpsilonSq 2026-06-13 10:21:51 +02:00
BuildShadowCellSetTests.cs T6 (BR-7) C2: BuildShadowCellSet - the registration-side portal flood 2026-06-11 14:02:08 +02:00
CameraCornerSealReplayTests.cs test(phys): §2b corner-seal replay — camera-penetration hypothesis REFUTED (openings, not walls) 2026-06-10 09:59:48 +02:00
CellarLipWedgeTests.cs chore(p2): strip cellar-lip dispatch-trace probes after visual confirmation 2026-06-05 09:24:20 +02:00
CellArrayTests.cs feat(physics): Stage 1 — CellArray ordered/deduped cell collection (retail CELLARRAY) 2026-06-03 08:54:45 +02:00
CellarUpTrajectoryReplayTests.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
CellDumpRoundTripTests.cs feat(phys): A6.P3 #98 Step 2 — cell-dump probe + roundtrip test 2026-05-23 15:16:56 +02:00
CellGraphMembershipTests.cs fix(render): doorway blue-hole — render root clobbered by NPCs (CurrCell per-entity write) 2026-06-03 10:12:38 +02:00
CellGraphPopulationTests.cs feat(core): UCG Stage 1 — populate CellGraph from CacheCellStruct + AddLandblock (inert) 2026-06-02 09:29:30 +02:00
CellMarchLandblockPreservationTests.cs fix(teleport D): cell-march preserves seed landblock id when no resident LB (no more lbX=0 outbound) 2026-06-22 13:38:48 +02:00
CellPhysicsPortalWiringTests.cs feat(physics): Phase 2 — wire CellBSP + Portals into CellPhysics 2026-05-19 16:52:20 +02:00
CellSurfaceTests.cs feat(core): Phase B.3 — CellSurface (indoor floor polygon projection) 2026-04-12 09:51:22 +02:00
CellTransitAddAllOutsideCellsTests.cs fix(phys): #106 — outdoor membership crosses landblock boundaries (LandDefs global-lcoord port) 2026-06-09 23:10:59 +02:00
CellTransitCheckBuildingTransitTests.cs T6 (BR-7) C1: signed OtherPortalId + the >=0 building-transit gate 2026-06-11 13:56:16 +02:00
CellTransitFindCellListTests.cs feat(physics): Phase 2 — BuildingPhysics + CheckBuildingTransit 2026-05-19 17:34:38 +02:00
CellTransitFindCellSetTests.cs fix(teleport D): cell-march preserves seed landblock id when no resident LB (no more lbX=0 outbound) 2026-06-22 13:38:48 +02:00
CellTransitFindTransitCellsSphereTests.cs T6 (BR-7) C4: straddle-only outside-add (A6.P5 widening DELETED) + #90 stickiness removed 2026-06-11 14:44:49 +02:00
CellTransitFindVisibleChildCellTests.cs feat(A): port find_visible_child_cell + AdjustPosition (Render Residual A primitives) 2026-06-05 10:56:16 +02:00
CellTransitTests.cs T6 (BR-7) C4: straddle-only outside-add (A6.P5 widening DELETED) + #90 stickiness removed 2026-06-11 14:44:49 +02:00
CollisionExemptionTests.cs fix(physics): #137 Task 3 — port obstruction_ethereal verbatim; retire AD-7 shim 2026-06-24 19:20:02 +02:00
CollisionPrimitivesTests.cs feat(physics): port 9 collision primitives from acclient.exe (chunk_00530000.c) 2026-04-12 23:53:47 +02:00
CylSphereFamilyTests.cs fix #172: port the retail CCylSphere collision family (platform step-up) 2026-07-05 14:52:28 +02:00
DoorBugTrajectoryReplayTests.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
DoorCollisionApparatusTests.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
DoorSetupGfxObjInspectionTests.cs test(phys): A6.P4 door inside-out — locate cottage wall, identify corner-slide hypothesis 2026-05-25 08:34:52 +02:00
DoorwayMembershipReplayTests.cs test(core): commit doorway-threshold fixture for DoorwayMembershipReplayTests (portable) 2026-06-02 15:22:57 +02:00
EntityCollisionFlagsTests.cs feat(physics): live-entity collision plumbing (Commit A) 2026-04-29 13:12:56 +02:00
FindEnvCollisionsMultiCellTests.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
FramesStationaryFallTests.cs feat(#182): frames_stationary_fall round-trip in the kept transition internals (Slice 1b/1c) 2026-07-07 14:11:35 +02:00
GfxObjDumpRoundTripTests.cs feat(phys): A6.P3 #98 — GfxObj dump infrastructure (ACDREAM_DUMP_GFXOBJS) 2026-05-23 20:24:26 +02:00
HandleAllCollisionsTests.cs feat(#182): port handle_all_collisions as a pure Core unit (Slice 2a) 2026-07-07 14:12:59 +02:00
IndoorContactPlaneRetentionTests.cs docs(test): A6.P3 slice 1 T5 — update stale call-chain reference in test doc 2026-05-22 09:37:52 +02:00
IndoorWalkablePlaneTests.cs Revert "fix(physics): remove per-frame indoor walkable-plane synthesis" 2026-05-20 09:17:24 +02:00
InterpolationManagerTests.cs feat(motion): L.3 M1 — fresh InterpolationManager port + retail spec 2026-05-05 14:56:42 +02:00
InWorldLinkGuardTests.cs fix(R4-V5): remote transition links stripped by the detached-object guard - door swings snapped (adds register TS-40) 2026-07-03 15:10:16 +02:00
Issue98CellarUpReplayTests.cs test(phys): A6.P3 #98 Step 3 — deterministic replay harness 2026-05-23 15:25:40 +02:00
Issue108CellarAscentViewerReplayTests.cs #108-residual apparatus: vertical cellar-ascent viewer harness - membership/viewer layer EXONERATED 2026-06-12 22:05:06 +02:00
Issue133DungeonTeleportPrefixTests.cs fix(G.3a): validated-claim placement keeps the claim's landblock prefix (#133) 2026-06-13 18:27:45 +02:00
Issue137CorridorSeamInspectionTests.cs fix #137 (window climb): the player's collision capsule topped out at 1.2m — head sphere 0.63m too low 2026-07-05 19:57:11 +02:00
Issue137CorridorSeamReplayTests.cs fix #137 (window climb): the player's collision capsule topped out at 1.2m — head sphere 0.63m too low 2026-07-05 19:57:11 +02:00
Issue137SlidingNormalLifecycleTests.cs fix #137 (corridor phantom resolved): slide_sphere opposing branch returns Collided; the 'wall' was synthetic 2026-07-05 18:27:40 +02:00
Issue147ArwicBuildingsDumpTests.cs fix(physics): #147 — far-town city/perimeter walls had no collision (portal-less buildings skipped) 2026-06-24 16:24:48 +02:00
Issue175HubDoorPoseInspectionTests.cs fix #175 (take 2): the cycle lookup used the bare style key — silent no-op 2026-07-05 17:10:19 +02:00
Issue180CorridorSweepHysteresisReplayTests.cs fix #180 (root): retail adjust_to_plane - PathClipped stops now resolve to the contact point, not a step boundary 2026-07-06 17:20:46 +02:00
Issue182CrowdJumpTests.cs feat(#182): route player collision response through the ported UpdateObjectInternal chain (Slice 2b/2c) 2026-07-07 14:25:47 +02:00
Issue176177SeamTransitLagTests.cs docs+test #176/#177: 12 mechanisms refuted, apparatus shipped, probe protocol staged 2026-07-05 21:20:03 +02:00
LandDefsBlockOffsetTests.cs feat(physics #145): Slice 1 — Position/Frame types + LandDefs.GetBlockOffset (0x0043e630) 2026-06-21 10:30:20 +02:00
LandDefsTests.cs fix(phys): #106 — outdoor membership crosses landblock boundaries (LandDefs global-lcoord port) 2026-06-09 23:10:59 +02:00
MotionCommandCatalogDatTests.cs feat(L.1b): dual MotionCommand catalog — AceModern runtime + Retail2013 conformance 2026-06-30 22:13:36 +02:00
MotionCommandCatalogTests.cs feat(L.1b): dual MotionCommand catalog — AceModern runtime + Retail2013 conformance 2026-06-30 22:13:36 +02:00
MotionCommandResolverTests.cs fix(anim): Phase L.1b route motion commands 2026-04-28 10:46:22 +02:00
MotionInterpreterDoMotionFamilyTests.cs feat(R3-W5): DoMotion family verbatim + the ONE DoInterpretedMotion + per-op zero-tick flush (closes J3, J4, J9, J14) 2026-07-03 08:57:33 +02:00
MotionInterpreterFunnelTests.cs feat(physics): R5-V4 behavioral slice — head stance dispatch (all mt) + #164 autonomy bit + mt-0 wire flags 2026-07-05 10:18:26 +02:00
MotionInterpreterGroundLifecycleTests.cs feat(R3-W4): ground transitions + lifecycle verbatim; K-fix18 DELETED (closes J8, J10, J11-shape, J12, J13, J18, J19) 2026-07-02 23:01:31 +02:00
MotionInterpreterJumpFamilyTests.cs feat(R3-W3): verbatim jump family — charge gates, jump_is_allowed chain, epsilon fixes; StandingLongJump misattribution retired (closes J5, J6, J7-interp-side, J16-epsilons) 2026-07-02 22:37:07 +02:00
MotionInterpreterPendingMotionsTests.cs feat(R3-W2): pending_motions lifecycle + the MotionDone consumer — the R2 seam lands (closes J1, J17) 2026-07-02 22:24:56 +02:00
MotionInterpreterTests.cs feat(R3-W3): verbatim jump family — charge gates, jump_is_allowed chain, epsilon fixes; StandingLongJump misattribution retired (closes J5, J6, J7-interp-side, J16-epsilons) 2026-07-02 22:37:07 +02:00
MotionNormalizationTests.cs feat(R3-W6): LOCAL PLAYER UNIFICATION — edge-driven retail input; UpdatePlayerAnimation + the synthesis layer DELETED (closes J15) 2026-07-03 09:19:56 +02:00
MotionSequenceGateTests.cs feat(L.2g-S1): retail movement-event staleness gate (DEV-6) 2026-07-02 15:44:06 +02:00
MotionVelocityPipelineTests.cs fix(#170): refresh remote body velocity from get_state_velocity (kill the attack glide) 2026-07-04 09:56:40 +02:00
ObstructionEtherealTests.cs fix(physics): port retail Layer-2 ethereal override -- open doors passable (pc:276961) 2026-06-24 21:03:08 +02:00
PhysicsBodyCellSyncTests.cs test(physics #145): continuous-tracking test — refutes the review staleness claim 2026-06-21 17:38:47 +02:00
PhysicsBodyTests.cs feat(#182): PhysicsBody fsf state + CachedVelocity; ungate small-velocity-zero (Slice 1a) 2026-07-07 13:39:28 +02:00
PhysicsDiagnosticsTests.cs feat(core): Phase W Stage 0 — [cell-swept] diagnostic (swept vs static cell, no behavior change) 2026-06-02 14:08:00 +02:00
PhysicsEngineAdjustPositionTests.cs feat(A): port find_visible_child_cell + AdjustPosition (Render Residual A primitives) 2026-06-05 10:56:16 +02:00
PhysicsEngineResidencyTests.cs feat(teleport B): PhysicsEngine.IsLandblockTerrainResident worldReady query 2026-06-22 13:05:38 +02:00
PhysicsEngineTests.cs fix #172: port the retail CCylSphere collision family (platform step-up) 2026-07-05 14:52:28 +02:00
PlayerWeenieTests.cs feat(physics): PlayerWeenie with retail Run/Jump formulas 2026-04-13 23:15:25 +02:00
PortalInfoTests.cs feat(physics): Phase 2 — wire CellBSP + Portals into CellPhysics 2026-05-19 16:52:20 +02:00
PortalPlaneTests.cs feat(core): Phase B.3 — PortalPlane (plane math + crossing detection) 2026-04-12 18:17:48 +02:00
RemoteDeOverlapMechanismTests.cs feat(#184): Slice 2b — unify the remote player/NPC fork (players collide faithfully) 2026-07-08 00:45:44 +02:00
RemoteMotionCombinerTests.cs feat(physics): R5-V1 — port PositionManager/Sticky/Constraint + TargetManager (Core, unwired) 2026-07-03 19:34:49 +02:00
RemoteWeenieRunRateTests.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
RemoveCellsForLandblockTests.cs fix(physics): D8 — RemoveCellsForLandblock; cell transforms rebase per apply 2026-06-24 19:34:16 +02:00
ResolveCellIdTests.cs feat(physics): Phase 2 — BuildingPhysics + CheckBuildingTransit 2026-05-19 17:34:38 +02:00
ResolveResultOkTests.cs feat(A): wire SweepEye to the verbatim update_viewer (start-cell + fallbacks) 2026-06-05 11:10:32 +02:00
RetailObserverTraceConformanceTests.cs feat(physics): R5-V4 behavioral slice — head stance dispatch (all mt) + #164 autonomy bit + mt-0 wire flags 2026-07-05 10:18:26 +02:00
ServerControlledLocomotionTests.cs feat(R4-V4): REMOTE cutover - per-remote MoveToManager; RemoteMoveToDriver + PlanMoveToStart DELETED (closes M1-remote, M4/M5/M6/M8-remote; retires AD-8, AD-9, AP-8, AP-9) 2026-07-03 12:18:05 +02:00
ShadowObjectRegistryMultiPartTests.cs test(phys): Task 6 regression — Deregister clears _entityShapes cache 2026-05-24 15:22:30 +02:00
ShadowObjectRegistryTests.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
ShadowShapeBuilderShapeSourceTests.cs fix #182: port CSphere collision family — retail-faithful crowd wiggle (retires TS-45) 2026-07-07 11:25:56 +02:00
ShadowShapeBuilderTests.cs feat(physics): Task 2 — true sphere collision primitive (CSphere::intersects_sphere) 2026-06-24 19:08:53 +02:00
SphereCollisionFamilyTests.cs fix #182: port CSphere collision family — retail-faithful crowd wiggle (retires TS-45) 2026-07-07 11:25:56 +02:00
SphereIntersectsCellBspTests.cs fix(physics): #90 — sphere-overlap cell stickiness at doorway threshold 2026-05-20 20:30:36 +02:00
SphereIntersectsSphereConformanceTests.cs feat(physics): Task 2 — true sphere collision primitive (CSphere::intersects_sphere) 2026-06-24 19:08:53 +02:00
TeleportFarTownRunawayTests.cs fix(teleport D): cell-march preserves seed landblock id when no resident LB (no more lbX=0 outbound) 2026-06-22 13:38:48 +02:00
TerrainSurfaceTests.cs fix(scenery): #49 9×9 loop, per-spawn building check, triangle slope 2026-05-07 21:15:11 +02:00
TransitionCheckOtherCellsTests.cs chore(phys): A6.P3 #98 triage — revert neg-poly + bldg-check experiments 2026-05-23 15:11:49 +02:00
TransitionTests.cs fix(physics): Phase A8.F — viewer sweeps bypass the 30-step cap (retail-faithful) 2026-05-29 20:35:26 +02:00
TransitionTypesTests.cs Revert "fix(physics): remove per-frame indoor walkable-plane synthesis" 2026-05-20 09:17:24 +02:00
WalkMissDiagnosticTests.cs feat(physics): WalkMissDiagnostic aggregator for ISSUES #83 probe spike 2026-05-20 10:31:39 +02:00
WeenieErrorCodeTableTests.cs feat(R4-V1): command-selection family + state widening (closes M2-mechanics, M11, M12, M15) 2026-07-03 11:13:15 +02:00