namespace AcDream.Core.Physics.Motion; /// /// R4-V2 — verbatim port of retail's MoveToManager::MovementNode /// (acclient.h:57702, struct #6350): /// /// struct __cppobj MoveToManager::MovementNode : DLListData /// { // +0 dllist_next, +4 dllist_prev (DLListData) /// MovementTypes::Type type; // +8 — only 7 (MoveToPosition) and 9 (TurnToHeading) ever queued /// float heading; // +0xc — only meaningful for type 9 /// }; /// /// /// /// NAME WATCH (r4-port-plan.md §3 "New code target"): named /// MoveToNode, NOT MovementNode, to avoid colliding with R2's /// (the UNRELATED CMotionInterp::pending_motions /// node — a different queue on a different class; see the AD-34 register /// wording on both node types' shared "managed collection standing in for /// retail's intrusive DLList/LList" pattern). /// /// /// /// Retail allocates these with operator new(0x10) and links them onto /// MoveToManager::pending_actions (a DLList — doubly-linked, /// unlike CMotionInterp's singly-linked LList) via /// DLListBase::InsertAfter (tail-append; r4-moveto-decomp.md §4a). /// Ported as a managed /// of this value type — same pattern as 's port /// (AD-34 wording): node identity semantics preserved via /// LinkedListNode<MoveToNode> references rather than raw /// prev/next pointers, FIFO order preserved via tail-append + /// RemoveFirst. /// /// /// Retail type (+8) — only /// (7) and /// (9) are ever queued /// (r4-moveto-decomp.md §4a: AddMoveToPositionNode / /// AddTurnToHeadingNode are the only two producers; /// 's dispatch is a defensive /// if/if, not a full switch — an unknown type stalls rather than /// throwing, matching the raw's shape). /// Retail heading (+0xc) — only meaningful for /// nodes; zero/unused for /// nodes. public readonly record struct MoveToNode(MovementType Type, float Heading);