diff --git a/src/AcDream.App/Rendering/GameWindow.cs b/src/AcDream.App/Rendering/GameWindow.cs index 6186e33..e3f2dcf 100644 --- a/src/AcDream.App/Rendering/GameWindow.cs +++ b/src/AcDream.App/Rendering/GameWindow.cs @@ -2054,6 +2054,28 @@ public sealed class GameWindow : IDisposable stanceOverride: NonCombatStance, commandOverride: cmdOverride); + // AC reuses right-side animations for left-side motions (played in + // reverse). If the left-side command has no cycle, fall back to the + // right-side equivalent so the player isn't stuck in idle. + if (cycle is null || cycle.Framerate == 0f || cycle.HighFrame <= cycle.LowFrame) + { + ushort fallback = cmdOverride switch + { + 0x000E => 0x000D, // TurnLeft → TurnRight + 0x0010 => 0x000F, // SideStepLeft → SideStepRight + 0x0006 => 0x0005, // WalkBackward → WalkForward + _ => (ushort)0, + }; + if (fallback != 0) + { + cycle = AcDream.Core.Meshing.MotionResolver.GetIdleCycle( + ae.Setup, _dats, + motionTableIdOverride: _playerMotionTableId, + stanceOverride: NonCombatStance, + commandOverride: fallback); + } + } + if (cycle is null || cycle.Framerate == 0f || cycle.HighFrame <= cycle.LowFrame) return; // If the entity has a sequencer, use SetCycle for transition-link-aware