diff --git a/OpenRA.Mods.Common/Traits/Render/WithMakeAnimation.cs b/OpenRA.Mods.Common/Traits/Render/WithMakeAnimation.cs index 7dfba69dba..a36613c205 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithMakeAnimation.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithMakeAnimation.cs @@ -38,6 +38,7 @@ namespace OpenRA.Mods.Common.Traits.Render readonly WithMakeAnimationInfo info; readonly WithSpriteBody[] wsbs; readonly bool skipMakeAnimation; + WithMakeOverlay[] overlays; int token = Actor.InvalidConditionToken; @@ -51,6 +52,7 @@ namespace OpenRA.Mods.Common.Traits.Render void INotifyCreated.Created(Actor self) { + overlays = self.TraitsImplementing().ToArray(); if (!skipMakeAnimation) Forward(self, () => { }); } @@ -76,6 +78,9 @@ namespace OpenRA.Mods.Common.Traits.Render onComplete(); }); }); + + foreach (var overlay in overlays) + overlay.Forward(self); } public void Reverse(Actor self, Action onComplete) @@ -99,6 +104,9 @@ namespace OpenRA.Mods.Common.Traits.Render onComplete(); }); }); + + foreach (var overlay in overlays) + overlay.Reverse(self); } public void Reverse(Actor self, Activity activity, bool queued = true) @@ -115,6 +123,9 @@ namespace OpenRA.Mods.Common.Traits.Render self.QueueActivity(queued, activity); }); + + foreach (var overlay in overlays) + overlay.Reverse(self); } // TODO: Make this use Forward instead @@ -148,6 +159,9 @@ namespace OpenRA.Mods.Common.Traits.Render } }); } + + foreach (var overlay in overlays) + overlay.Forward(self); } // TODO: Make this use Reverse instead @@ -181,6 +195,9 @@ namespace OpenRA.Mods.Common.Traits.Render } }); } + + foreach (var overlay in overlays) + overlay.Reverse(self); } } } diff --git a/OpenRA.Mods.Common/Traits/Render/WithMakeOverlay.cs b/OpenRA.Mods.Common/Traits/Render/WithMakeOverlay.cs new file mode 100644 index 0000000000..8a3427a49a --- /dev/null +++ b/OpenRA.Mods.Common/Traits/Render/WithMakeOverlay.cs @@ -0,0 +1,65 @@ +#region Copyright & License Information +/* + * Copyright 2007-2021 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using OpenRA.Graphics; +using OpenRA.Traits; + +namespace OpenRA.Mods.Common.Traits.Render +{ + [Desc("Draws an overlay on top of a make animation.")] + public class WithMakeOverlayInfo : TraitInfo + { + [SequenceReference] + [FieldLoader.Require] + [Desc("Sequence name to use.")] + public readonly string Sequence = null; + + [PaletteReference(nameof(IsPlayerPalette))] + [Desc("Custom palette name.")] + public readonly string Palette = null; + + [Desc("Custom palette is a player palette BaseName.")] + public readonly bool IsPlayerPalette = false; + + public override object Create(ActorInitializer init) { return new WithMakeOverlay(init.Self, this); } + } + + public class WithMakeOverlay + { + readonly WithMakeOverlayInfo info; + readonly AnimationWithOffset anim; + bool visible; + + public WithMakeOverlay(Actor self, WithMakeOverlayInfo info) + { + this.info = info; + + var rs = self.Trait(); + var overlay = new Animation(self.World, rs.GetImage(self)); + overlay.Play(info.Sequence); + + anim = new AnimationWithOffset(overlay, null, () => !visible); + rs.Add(anim, info.Palette, info.IsPlayerPalette); + } + + public void Forward(Actor self) + { + visible = true; + anim.Animation.PlayThen(info.Sequence, () => visible = false); + } + + public void Reverse(Actor self) + { + visible = true; + anim.Animation.PlayBackwardsThen(info.Sequence, () => visible = false); + } + } +}