diff --git a/src/AcDream.App/Rendering/GameWindow.cs b/src/AcDream.App/Rendering/GameWindow.cs index e7b658b..43ba1c1 100644 --- a/src/AcDream.App/Rendering/GameWindow.cs +++ b/src/AcDream.App/Rendering/GameWindow.cs @@ -2936,6 +2936,14 @@ public sealed class GameWindow : IDisposable // gets the wire's (or seeded) ForwardCommand verbatim // so apply_current_movement produces correct velocity. uint cycleToPlay = animCycle; + if (System.Environment.GetEnvironmentVariable("ACDREAM_REMOTE_VEL_DIAG") == "1" + && (animCycle & 0xFFu) is 0x05u or 0x07u) + { + bool hc = ae.Sequencer.HasCycle(fullStyle, cycleToPlay); + System.Console.WriteLine( + $"[HASCYCLE] guid={update.Guid:X8} style=0x{fullStyle:X8} " + + $"requestedCycle=0x{cycleToPlay:X8} HasCycle={hc}"); + } if (!ae.Sequencer.HasCycle(fullStyle, cycleToPlay)) { uint requested = cycleToPlay; diff --git a/src/AcDream.Core/Physics/AnimationSequencer.cs b/src/AcDream.Core/Physics/AnimationSequencer.cs index 76de86a..fb33c0f 100644 --- a/src/AcDream.Core/Physics/AnimationSequencer.cs +++ b/src/AcDream.Core/Physics/AnimationSequencer.cs @@ -434,29 +434,7 @@ public sealed class AnimationSequencer // cycle. Without this, the old RunForward → ??? link would // continue draining for ~100 ms before the new Falling cycle // starts, defeating the "skip the link" intent. - // - // 2026-05-03: ALSO do a full drain when transitioning between - // FORWARD-LOCOMOTION cycles (Walk↔Run, Walk↔WalkBackward, etc.) - // — i.e. when both old and new motion's low byte is in the - // {0x05 WalkForward, 0x06 WalkBackward, 0x07 RunForward} set. - // ClearCyclicTail alone leaves _currNode in the previous cycle's - // non-cyclic head (link frames from a Ready→walk transition), - // and the visible legs continue playing those head frames before - // reaching the new run cycle. The user-reported symptom: walk→run - // direct transition (release shift while W held) did not visibly - // switch the leg cycle — body advanced at walk pace until the - // next motion event (turn / stop) re-fired SetCycle and finally - // aligned the queue. Live cdb trace of retail acclient.exe - // 2026-05-03 (tools/cdb-scripts/walk_run_motion_trace.log) shows - // retail uses an additive add_to_queue with no truncate — the - // MotionTableManager's per-tick CheckForCompletedMotions handles - // the natural progression. We don't have that machinery, so we - // emulate via a hard reset on the locomotion-cycle transition. - uint oldLow = CurrentMotion & 0xFFu; - uint newLow = motion & 0xFFu; - bool oldIsForwardLoc = oldLow == 0x05u || oldLow == 0x06u || oldLow == 0x07u; - bool newIsForwardLoc = newLow == 0x05u || newLow == 0x06u || newLow == 0x07u; - if (skipTransitionLink || (oldIsForwardLoc && newIsForwardLoc)) + if (skipTransitionLink) { _queue.Clear(); _currNode = null;