diff --git a/src/Murder.Editor/Systems/SpriteRenderDebugSystem.cs b/src/Murder.Editor/Systems/SpriteRenderDebugSystem.cs index a5d74c8c9..a5fa099c1 100644 --- a/src/Murder.Editor/Systems/SpriteRenderDebugSystem.cs +++ b/src/Murder.Editor/Systems/SpriteRenderDebugSystem.cs @@ -166,7 +166,10 @@ public void Draw(RenderContext render, Context context) if (!frameInfo.Event.IsEmpty) { - e.SendMessage(new AnimationEventMessage(frameInfo.Event.ToString())); + foreach (var ev in frameInfo.Event) + { + e.SendMessage(new AnimationEventMessage(ev)); + } } if (frameInfo.Complete && overload != null) diff --git a/src/Murder/Core/Graphics/Animation.cs b/src/Murder/Core/Graphics/Animation.cs index bb6bf3393..6a07de2ca 100644 --- a/src/Murder/Core/Graphics/Animation.cs +++ b/src/Murder/Core/Graphics/Animation.cs @@ -125,7 +125,15 @@ public FrameInfo Evaluate(float time, float lastFrameTime, bool animationLoop, f int clampedFrame = Math.Clamp(frame, 0, Frames.Length - 1); if (previousFrame != frame) { - return new FrameInfo(Frames[clampedFrame], time + Game.FixedDeltaTime * 2 >= animationDuration, Events.ContainsKey(clampedFrame) ? Events[clampedFrame] : ReadOnlySpan.Empty); + var events = ImmutableArray.CreateBuilder(); + for (int i = previousFrame; i <= frame; i++) + { + if (Events.ContainsKey(i)) + { + events.Add(Events[i]); + } + } + return new FrameInfo(Frames[clampedFrame], time + Game.FixedDeltaTime * 2 >= animationDuration, events.ToImmutable()); } else { diff --git a/src/Murder/Core/Graphics/FrameInfo.cs b/src/Murder/Core/Graphics/FrameInfo.cs index f0ea70a18..8ce01f2a1 100644 --- a/src/Murder/Core/Graphics/FrameInfo.cs +++ b/src/Murder/Core/Graphics/FrameInfo.cs @@ -9,7 +9,7 @@ namespace Murder.Core; /// /// A struct representing information about a single animation frame, such as its index in the list and a flag indicating whether the animation is complete /// -public ref struct FrameInfo +public readonly struct FrameInfo { internal static FrameInfo Fail => new() { Failed = true }; @@ -28,9 +28,16 @@ public ref struct FrameInfo /// /// A string ID representing the events played since the last played frame (if any). Usually set in Aseprite. /// - public readonly ReadOnlySpan Event; + public readonly ImmutableArray Event = ImmutableArray.Empty; public FrameInfo(int frame, bool animationComplete, ReadOnlySpan @event) + { + Frame = frame; + Complete = animationComplete; + Event = ImmutableArray.Create(@event.ToString()); + } + + public FrameInfo(int frame, bool animationComplete, ImmutableArray @event) { Frame = frame; Complete = animationComplete; diff --git a/src/Murder/Systems/Agents/AgentSpriteSystem.cs b/src/Murder/Systems/Agents/AgentSpriteSystem.cs index e560a47a0..4219d75f8 100644 --- a/src/Murder/Systems/Agents/AgentSpriteSystem.cs +++ b/src/Murder/Systems/Agents/AgentSpriteSystem.cs @@ -200,7 +200,10 @@ public void Draw(RenderContext render, Context context) if (!frameInfo.Event.IsEmpty) { - e.SendMessage(new AnimationEventMessage(frameInfo.Event.ToString())); + foreach (var ev in frameInfo.Event) + { + e.SendMessage(new AnimationEventMessage(ev)); + } } // The animation overload is now done diff --git a/src/Murder/Systems/Graphics/SpriteRenderSystem.cs b/src/Murder/Systems/Graphics/SpriteRenderSystem.cs index 7854fe641..ac0967cbd 100644 --- a/src/Murder/Systems/Graphics/SpriteRenderSystem.cs +++ b/src/Murder/Systems/Graphics/SpriteRenderSystem.cs @@ -179,7 +179,10 @@ public void Draw(RenderContext render, Context context) if (!frameInfo.Event.IsEmpty) { - e.SendMessage(new AnimationEventMessage(frameInfo.Event.ToString())); + foreach (var ev in frameInfo.Event) + { + e.SendMessage(new AnimationEventMessage(ev)); + } } if (frameInfo.Complete)