acdream/src/AcDream.Core/Physics/Motion
Erik 427332acaa fix(#170): stop per-frame interpreted re-dispatch flooding pending_motions (partial — flood fixed, run install not yet sustained)
Live retail cdb tracing + acdream probes root-caused the creature chase "slide"
end-to-end, SUPERSEDING the earlier MovementManager-coexistence hypothesis
(eb423fb7):

  Chase run cycle is manufactured client-side from mt-6 MoveToObject:
    HandleUpdateTarget -> MoveToObject_Internal -> (TurnToHeading node completes
    via UseTime) -> BeginMoveForward -> _DoMotion(RunForward) sets substate.
  BeginTurnToHeading (MoveToManager 0x00529b90) bails while
  CMotionInterp.motions_pending is non-empty (retail-faithful).
  acdream's pending_motions EXPLODED to ~1.3M entries (live: add=1.37M vs
  done=5.7K) because the NPC per-tick called rm.Motion.apply_current_movement
  EVERY FRAME, which for a remote (has a DefaultSink) re-ran
  ApplyInterpretedMovement and re-dispatched the WHOLE interpreted state (stance
  0x8000003C + forward=attack + sidestep/turn stops), each appending a
  pending_motions node that barely drains. => MotionsPending() permanently true
  => the chase turn never started => BeginMoveForward/RunForward ~never fired =>
  the creature slid in an idle+attack pose. Retail dispatches per MOTION EVENT
  (per UM), never per frame — cdb drain trace: retail add_to_queue == MotionDone.

FIX: delete the per-frame apply_current_movement call in the grounded remote-NPC
dead-reckon path (GameWindow ~9992). The motion is already dispatched per UM by
the funnel (MoveToInterpretedState) + by the MoveToManager per node; body
velocity is refreshed directly by the existing get_state_velocity line.

RESULT (verified live): pending_motions depth 1.3M -> ~1 (add~=done); "stuck in
attack animation" GONE (user-confirmed); run cycle now installs (BeginMoveForward
1->10, RunForward held 0->7). PARTIAL: still not fully sustained — BeginTurnToHeading
still blocked motionsPending=True 256/272 (94%) because a residual Ready
(0x41000003) stop-node backlog keeps the queue from fully emptying between swings
(retail hits add==done exactly). acdream gets ~10 run-starts vs retail's ~21, so
it now twitches+glides instead of a clean run-then-stop. Residual = the R2/R3
Ready-stop drain (next session; see docs/research/2026-07-04-*-handoff.md).

Also includes the env-gated #170 diagnostic probes used to find this
(ACDREAM_MVTO_DIAG=1: [mvto]/[npc-tick]/[drain]/[drainq]) — TEMPORARY, strip when
#170 closes. No effect on normal runs. Core suite green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 20:29:10 +02:00
..
AnimSequenceNode.cs feat(R1-P0/P1): CSequence research base + verbatim AnimSequenceNode 2026-07-02 19:45:56 +02:00
CMotionTable.cs feat(R2-Q2): verbatim CMotionTable — the GetObjectSequence dispatcher 2026-07-02 20:48:26 +02:00
ConstraintManager.cs feat(physics): R5-V1 — port PositionManager/Sticky/Constraint + TargetManager (Core, unwired) 2026-07-03 19:34:49 +02:00
CSequence.cs feat(R1-P4): verbatim update_internal / update / advance_to_next_animation 2026-07-02 20:05:04 +02:00
FrameOps.cs feat(R1-P4): verbatim update_internal / update / advance_to_next_animation 2026-07-02 20:05:04 +02:00
IPhysicsObjHost.cs feat(physics): R5-V1 — port PositionManager/Sticky/Constraint + TargetManager (Core, unwired) 2026-07-03 19:34:49 +02:00
MotionDeltaFrame.cs feat(physics): R5-V1 — port PositionManager/Sticky/Constraint + TargetManager (Core, unwired) 2026-07-03 19:34:49 +02:00
MotionNode.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
MotionState.cs feat(R2-Q1): verbatim MotionState (gap H2) 2026-07-02 20:31:16 +02:00
MotionTableDispatchSink.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
MotionTableManager.cs feat(R2-Q3): verbatim MotionTableManager — the pending-animation queue (closes H3, H15-core) 2026-07-02 21:01:50 +02:00
MovementParameters.cs feat(R4-V1): command-selection family + state widening (closes M2-mechanics, M11, M12, M15) 2026-07-03 11:13:15 +02:00
MoveToManager.cs fix(#170): stop per-frame interpreted re-dispatch flooding pending_motions (partial — flood fixed, run install not yet sustained) 2026-07-04 20:29:10 +02:00
MoveToMath.cs feat(physics): R5-V1 — port PositionManager/Sticky/Constraint + TargetManager (Core, unwired) 2026-07-03 19:34:49 +02:00
MoveToNode.cs feat(R4-V2): MoveToManager verbatim - all 33 members + conformance harness (closes M1/M3/M4/M5/M6/M10/M14-core) 2026-07-03 11:43:50 +02:00
PositionManager.cs feat(physics): R5-V1 — port PositionManager/Sticky/Constraint + TargetManager (Core, unwired) 2026-07-03 19:34:49 +02:00
StickyManager.cs feat(physics): R5-V1 — port PositionManager/Sticky/Constraint + TargetManager (Core, unwired) 2026-07-03 19:34:49 +02:00
TargetManager.cs feat(physics): R5-V1 — port PositionManager/Sticky/Constraint + TargetManager (Core, unwired) 2026-07-03 19:34:49 +02:00
TargettedVoyeurInfo.cs feat(physics): R5-V1 — port PositionManager/Sticky/Constraint + TargetManager (Core, unwired) 2026-07-03 19:34:49 +02:00