diff --git a/OpenRA.Game/Graphics/UISpriteRenderable.cs b/OpenRA.Game/Graphics/UISpriteRenderable.cs index 2188283a6c..03fc578280 100644 --- a/OpenRA.Game/Graphics/UISpriteRenderable.cs +++ b/OpenRA.Game/Graphics/UISpriteRenderable.cs @@ -17,14 +17,16 @@ namespace OpenRA.Graphics public struct UISpriteRenderable : IRenderable, IFinalizedRenderable { readonly Sprite sprite; + readonly WPos effectiveWorldPos; readonly int2 screenPos; readonly int zOffset; readonly PaletteReference palette; readonly float scale; - public UISpriteRenderable(Sprite sprite, int2 screenPos, int zOffset, PaletteReference palette, float scale) + public UISpriteRenderable(Sprite sprite, WPos effectiveWorldPos, int2 screenPos, int zOffset, PaletteReference palette, float scale) { this.sprite = sprite; + this.effectiveWorldPos = effectiveWorldPos; this.screenPos = screenPos; this.zOffset = zOffset; this.palette = palette; @@ -32,14 +34,14 @@ namespace OpenRA.Graphics } // Does not exist in the world, so a world positions don't make sense - public WPos Pos { get { return WPos.Zero; } } + public WPos Pos { get { return effectiveWorldPos; } } public WVec Offset { get { return WVec.Zero; } } public bool IsDecoration { get { return true; } } public PaletteReference Palette { get { return palette; } } public int ZOffset { get { return zOffset; } } - public IRenderable WithPalette(PaletteReference newPalette) { return new UISpriteRenderable(sprite, screenPos, zOffset, newPalette, scale); } + public IRenderable WithPalette(PaletteReference newPalette) { return new UISpriteRenderable(sprite, effectiveWorldPos, screenPos, zOffset, newPalette, scale); } public IRenderable WithZOffset(int newOffset) { return this; } public IRenderable OffsetBy(WVec vec) { return this; } public IRenderable AsDecoration() { return this; } diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index 027d4e7c7c..d0d366060f 100644 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -35,7 +35,6 @@ namespace OpenRA.Traits // depends on the order of pips in WorldRenderer.cs! public enum PipType { Transparent, Green, Yellow, Red, Gray, Blue, Ammo, AmmoEmpty } - public enum TagType { None, Fake, Primary } [Flags] public enum Stance @@ -250,7 +249,6 @@ namespace OpenRA.Traits public interface ILoadsPlayerPalettes { void LoadPlayerPalettes(WorldRenderer wr, string playerName, HSLColor playerColor, bool replaceExisting); } public interface IPaletteModifier { void AdjustPalette(IReadOnlyDictionary b); } public interface IPips { IEnumerable GetPips(Actor self); } - public interface ITags { IEnumerable GetTags(); } public interface ISelectionBar { float GetValue(); Color GetColor(); } public interface IPositionableInfo : ITraitInfo { } diff --git a/OpenRA.Mods.Common/Traits/Buildings/PrimaryBuilding.cs b/OpenRA.Mods.Common/Traits/Buildings/PrimaryBuilding.cs index c2238433bd..9255081878 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/PrimaryBuilding.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/PrimaryBuilding.cs @@ -25,16 +25,25 @@ namespace OpenRA.Mods.Common.Traits } [Desc("Used together with ClassicProductionQueue.")] - public class PrimaryBuildingInfo : TraitInfo { } - - public class PrimaryBuilding : IIssueOrder, IResolveOrder, ITags + public class PrimaryBuildingInfo : ITraitInfo, Requires { - bool isPrimary = false; - public bool IsPrimary { get { return isPrimary; } } + [UpgradeGrantedReference, Desc("The upgrades to grant while the primary building.")] + public readonly string[] Upgrades = { "primary" }; - public IEnumerable GetTags() + public object Create(ActorInitializer init) { return new PrimaryBuilding(init.Self, this); } + } + + public class PrimaryBuilding : IIssueOrder, IResolveOrder + { + readonly PrimaryBuildingInfo info; + readonly UpgradeManager manager; + + public bool IsPrimary { get; private set; } + + public PrimaryBuilding(Actor self, PrimaryBuildingInfo info) { - yield return isPrimary ? TagType.Primary : TagType.None; + this.info = info; + manager = self.Trait(); } public IEnumerable Orders @@ -53,14 +62,16 @@ namespace OpenRA.Mods.Common.Traits public void ResolveOrder(Actor self, Order order) { if (order.OrderString == "PrimaryProducer") - SetPrimaryProducer(self, !isPrimary); + SetPrimaryProducer(self, !IsPrimary); } public void SetPrimaryProducer(Actor self, bool state) { if (state == false) { - isPrimary = false; + IsPrimary = false; + foreach (var up in info.Upgrades) + manager.RevokeUpgrade(self, up, this); return; } @@ -78,7 +89,9 @@ namespace OpenRA.Mods.Common.Traits b.Trait.SetPrimaryProducer(b.Actor, false); } - isPrimary = true; + IsPrimary = true; + foreach (var up in info.Upgrades) + manager.GrantUpgrade(self, up, this); Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", "PrimaryBuildingSelected", self.Owner.Faction.InternalName); } diff --git a/OpenRA.Mods.Common/Traits/Render/SelectionDecorations.cs b/OpenRA.Mods.Common/Traits/Render/SelectionDecorations.cs index 609967c33e..df2758b451 100644 --- a/OpenRA.Mods.Common/Traits/Render/SelectionDecorations.cs +++ b/OpenRA.Mods.Common/Traits/Render/SelectionDecorations.cs @@ -42,7 +42,6 @@ namespace OpenRA.Mods.Common.Traits { // depends on the order of pips in TraitsInterfaces.cs! static readonly string[] PipStrings = { "pip-empty", "pip-green", "pip-yellow", "pip-red", "pip-gray", "pip-blue", "pip-ammo", "pip-ammoempty" }; - static readonly string[] TagStrings = { "", "tag-fake", "tag-primary" }; public readonly SelectionDecorationsInfo Info; readonly Actor self; @@ -90,16 +89,12 @@ namespace OpenRA.Mods.Common.Traits var pos = wr.ScreenPxPosition(self.CenterPosition); var tl = wr.Viewport.WorldToViewPx(pos + new int2(b.Left, b.Top)); var bl = wr.Viewport.WorldToViewPx(pos + new int2(b.Left, b.Bottom)); - var tm = wr.Viewport.WorldToViewPx(pos + new int2((b.Left + b.Right) / 2, b.Top)); foreach (var r in DrawControlGroup(wr, self, tl)) yield return r; foreach (var r in DrawPips(wr, self, bl)) yield return r; - - foreach (var r in DrawTags(wr, self, tm)) - yield return r; } IEnumerable DrawControlGroup(WorldRenderer wr, Actor self, int2 basePosition) @@ -114,7 +109,7 @@ namespace OpenRA.Mods.Common.Traits pipImages.Tick(); var pos = basePosition - (0.5f * pipImages.Image.Size).ToInt2() + new int2(9, 5); - yield return new UISpriteRenderable(pipImages.Image, pos, 0, pal, 1f); + yield return new UISpriteRenderable(pipImages.Image, self.CenterPosition, pos, 0, pal, 1f); } IEnumerable DrawPips(WorldRenderer wr, Actor self, int2 basePosition) @@ -146,35 +141,12 @@ namespace OpenRA.Mods.Common.Traits pipImages.PlayRepeating(PipStrings[(int)pip]); pipxyOffset += new int2(pipSize.X, 0); - yield return new UISpriteRenderable(pipImages.Image, pipxyBase + pipxyOffset, 0, pal, 1f); + yield return new UISpriteRenderable(pipImages.Image, self.CenterPosition, pipxyBase + pipxyOffset, 0, pal, 1f); } // Increment row pipxyOffset = new int2(0, pipxyOffset.Y - (pipSize.Y + 1)); } } - - IEnumerable DrawTags(WorldRenderer wr, Actor self, int2 basePosition) - { - var tagImages = new Animation(self.World, "pips"); - var pal = wr.Palette(Info.Palette); - var tagxyOffset = new int2(0, 6); - - foreach (var tags in self.TraitsImplementing()) - { - foreach (var tag in tags.GetTags()) - { - if (tag == TagType.None) - continue; - - tagImages.PlayRepeating(TagStrings[(int)tag]); - var pos = basePosition + tagxyOffset - (0.5f * tagImages.Image.Size).ToInt2(); - yield return new UISpriteRenderable(tagImages.Image, pos, 0, pal, 1f); - - // Increment row - tagxyOffset = tagxyOffset.WithY(tagxyOffset.Y + 8); - } - } - } } } diff --git a/OpenRA.Mods.Common/Traits/Render/WithDecoration.cs b/OpenRA.Mods.Common/Traits/Render/WithDecoration.cs index 6acfeb4aea..681840406e 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithDecoration.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithDecoration.cs @@ -20,16 +20,14 @@ namespace OpenRA.Mods.Common.Traits [Flags] public enum ReferencePoints { - Top = 0, - VCenter = 1, + Center = 0, + Top = 1, Bottom = 2, - - Left = 0 << 2, - HCenter = 1 << 2, - Right = 2 << 2, + Left = 4, + Right = 8, } - [Desc("Displays a custom animation if conditions are satisfied.")] + [Desc("Displays a custom UI overlay relative to the selection box.")] public class WithDecorationInfo : UpgradableTraitInfo { [Desc("Image used for this decoration. Defaults to the actor's type.")] @@ -41,131 +39,96 @@ namespace OpenRA.Mods.Common.Traits [Desc("Palette to render the sprite in. Reference the world actor's PaletteFrom* traits.")] [PaletteReference] public readonly string Palette = "chrome"; - [Desc("Point in the actor's bounding box used as reference for offsetting the decoration image. " + - "Possible values are any combination of Top, VCenter, Bottom and Left, HCenter, Right separated by a comma.")] + [Desc("Point in the actor's selection box used as reference for offsetting the decoration image. " + + "Possible values are combinations of Center, Top, Bottom, Left, Right.")] public readonly ReferencePoints ReferencePoint = ReferencePoints.Top | ReferencePoints.Left; - [Desc("Pixel offset relative to the actor's bounding box' reference point.")] - public readonly int2 Offset = int2.Zero; - [Desc("The Z offset to apply when rendering this decoration.")] public readonly int ZOffset = 1; - [Desc("Visual scale of the image.")] - public readonly float Scale = 1f; - - [Desc("Should this be visible to allied players?")] - public readonly bool ShowToAllies = true; - - [Desc("Should this be visible to enemy players?")] - public readonly bool ShowToEnemies = false; + [Desc("Player stances who can view the decoration.")] + public readonly Stance Stances = Stance.Ally; [Desc("Should this be visible only when selected?")] - public readonly bool SelectionDecoration = false; + public readonly bool RequiresSelection = false; public override object Create(ActorInitializer init) { return new WithDecoration(init.Self, this); } } - public class WithDecoration : UpgradableTrait, IRender, IPostRenderSelection + public class WithDecoration : UpgradableTrait, ITick, IRender, IPostRenderSelection { - readonly WithDecorationInfo info; + protected readonly Animation Anim; + readonly string image; - readonly Animation anim; readonly Actor self; public WithDecoration(Actor self, WithDecorationInfo info) : base(info) { - this.info = info; this.self = self; image = info.Image ?? self.Info.Name; - anim = new Animation(self.World, image, () => self.World.Paused); - anim.PlayRepeating(info.Sequence); - } - - public void PlaySingleFrame(int frame) - { - anim.PlayFetchIndex(info.Sequence, () => frame); + Anim = new Animation(self.World, image, () => self.World.Paused); + Anim.PlayRepeating(info.Sequence); } public virtual bool ShouldRender(Actor self) { return true; } public IEnumerable Render(Actor self, WorldRenderer wr) { - return !info.SelectionDecoration ? RenderInner(self, wr, self.Bounds) : Enumerable.Empty(); + return !Info.RequiresSelection ? RenderInner(self, wr) : Enumerable.Empty(); } public IEnumerable RenderAfterWorld(WorldRenderer wr) { - return info.SelectionDecoration ? RenderInner(self, wr, self.VisualBounds) : Enumerable.Empty(); + return Info.RequiresSelection ? RenderInner(self, wr) : Enumerable.Empty(); } - IEnumerable RenderInner(Actor self, WorldRenderer wr, Rectangle actorBounds) + IEnumerable RenderInner(Actor self, WorldRenderer wr) { - if (IsTraitDisabled) + if (IsTraitDisabled || self.IsDead || !self.IsInWorld || Anim == null) return Enumerable.Empty(); - if (self.IsDead || !self.IsInWorld) - return Enumerable.Empty(); - - if (anim == null) - return Enumerable.Empty(); - - var allied = self.Owner.IsAlliedWith(self.World.RenderPlayer); - - if (!allied && !info.ShowToEnemies) - return Enumerable.Empty(); - - if (allied && !info.ShowToAllies) - return Enumerable.Empty(); - - if (!ShouldRender(self)) - return Enumerable.Empty(); - - if (self.World.FogObscures(self)) - return Enumerable.Empty(); - - var pxPos = wr.ScreenPxPosition(self.CenterPosition); - actorBounds.Offset(pxPos.X, pxPos.Y); - - var img = anim.Image; - var imgSize = img.Size.ToInt2(); - - switch (info.ReferencePoint & (ReferencePoints)3) + if (self.World.RenderPlayer != null) { - case ReferencePoints.Top: - pxPos = pxPos.WithY(actorBounds.Top + imgSize.Y / 2); - break; - case ReferencePoints.VCenter: - pxPos = pxPos.WithY((actorBounds.Top + actorBounds.Bottom) / 2); - break; - case ReferencePoints.Bottom: - pxPos = pxPos.WithY(actorBounds.Bottom - imgSize.Y / 2); - break; + var stance = self.Owner.Stances[self.World.RenderPlayer]; + if (!Info.Stances.HasStance(stance)) + return Enumerable.Empty(); } - switch (info.ReferencePoint & (ReferencePoints)(3 << 2)) + if (!ShouldRender(self) || self.World.FogObscures(self)) + return Enumerable.Empty(); + + var bounds = self.VisualBounds; + var halfSize = (0.5f * Anim.Image.Size).ToInt2(); + + var boundsOffset = new int2(bounds.Left + bounds.Right, bounds.Top + bounds.Bottom) / 2; + var sizeOffset = -halfSize; + if (Info.ReferencePoint.HasFlag(ReferencePoints.Top)) { - case ReferencePoints.Left: - pxPos = pxPos.WithX(actorBounds.Left + imgSize.X / 2); - break; - case ReferencePoints.HCenter: - pxPos = pxPos.WithX((actorBounds.Left + actorBounds.Right) / 2); - break; - case ReferencePoints.Right: - pxPos = pxPos.WithX(actorBounds.Right - imgSize.X / 2); - break; + boundsOffset -= new int2(0, bounds.Height / 2); + sizeOffset += new int2(0, halfSize.Y); + } + else if (Info.ReferencePoint.HasFlag(ReferencePoints.Bottom)) + { + boundsOffset += new int2(0, bounds.Height / 2); + sizeOffset -= new int2(0, halfSize.Y); } - pxPos += info.Offset; + if (Info.ReferencePoint.HasFlag(ReferencePoints.Left)) + { + boundsOffset -= new int2(bounds.Width / 2, 0); + sizeOffset += new int2(halfSize.X, 0); + } + else if (Info.ReferencePoint.HasFlag(ReferencePoints.Right)) + { + boundsOffset += new int2(bounds.Width / 2, 0); + sizeOffset -= new int2(halfSize.X, 0); + } - // HACK: Because WorldRenderer.Position() does not care about terrain height at the location - var renderPos = wr.ProjectedPosition(pxPos); - renderPos = new WPos(renderPos.X, renderPos.Y + self.CenterPosition.Z, self.CenterPosition.Z); - - anim.Tick(); - - return new IRenderable[] { new SpriteRenderable(img, renderPos, WVec.Zero, info.ZOffset, wr.Palette(info.Palette), info.Scale, true) }; + var pxPos = wr.Viewport.WorldToViewPx(wr.ScreenPxPosition(self.CenterPosition) + boundsOffset) + sizeOffset; + return new IRenderable[] { new UISpriteRenderable(Anim.Image, self.CenterPosition, pxPos, Info.ZOffset, wr.Palette(Info.Palette), 1f) }; } + + public void Tick(Actor self) { Anim.Tick(); } } } diff --git a/OpenRA.Mods.Common/Traits/Render/WithRankDecoration.cs b/OpenRA.Mods.Common/Traits/Render/WithRankDecoration.cs index a9a5f65f3f..f25f22dd4a 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithRankDecoration.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithRankDecoration.cs @@ -21,7 +21,7 @@ namespace OpenRA.Mods.Common.Traits.Render protected override void UpgradeLevelChanged(Actor self, int oldLevel, int newLevel) { - PlaySingleFrame(newLevel - 1); + Anim.PlayFetchIndex(Info.Sequence, () => newLevel - 1); } } } diff --git a/OpenRA.Mods.Common/Traits/VeteranProductionIconOverlay.cs b/OpenRA.Mods.Common/Traits/VeteranProductionIconOverlay.cs index b08b9d2da1..ac2ade0a80 100644 --- a/OpenRA.Mods.Common/Traits/VeteranProductionIconOverlay.cs +++ b/OpenRA.Mods.Common/Traits/VeteranProductionIconOverlay.cs @@ -30,15 +30,9 @@ namespace OpenRA.Mods.Common.Traits [PaletteReference] public readonly string Palette = "chrome"; [Desc("Point on the production icon's used as reference for offsetting the overlay. ", - "Possible values are any combination of Top, VCenter, Bottom and Left, HCenter, Right separated by a comma.")] + "Possible values are combinations of Center, Top, Bottom, Left, Right.")] public readonly ReferencePoints ReferencePoint = ReferencePoints.Top | ReferencePoints.Left; - [Desc("Pixel offset relative to the icon's reference point.")] - public readonly int2 Offset = int2.Zero; - - [Desc("Visual scale of the overlay.")] - public readonly float Scale = 1f; - public object Create(ActorInitializer init) { return new VeteranProductionIconOverlay(init, this); } } @@ -76,55 +70,30 @@ namespace OpenRA.Mods.Common.Traits } } - public Sprite Sprite() + Sprite IProductionIconOverlay.Sprite { get { return sprite; } } + string IProductionIconOverlay.Palette { get { return info.Palette; } } + float2 IProductionIconOverlay.Offset(float2 iconSize) { - return sprite; + float x = 0; + float y = 0; + if (info.ReferencePoint.HasFlag(ReferencePoints.Top)) + y -= iconSize.Y / 2 - sprite.Size.Y / 2; + else if (info.ReferencePoint.HasFlag(ReferencePoints.Bottom)) + y += iconSize.Y / 2 - sprite.Size.Y / 2; + + if (info.ReferencePoint.HasFlag(ReferencePoints.Left)) + x -= iconSize.X / 2 - sprite.Size.X / 2; + else if (info.ReferencePoint.HasFlag(ReferencePoints.Right)) + x += iconSize.X / 2 - sprite.Size.X / 2; + + return new float2(x, y); } - public string Palette() - { - return info.Palette; - } - - public float Scale() - { - return info.Scale; - } - - public float2 Offset(float2 iconSize) - { - float offsetX = 0, offsetY = 0; - switch (info.ReferencePoint & (ReferencePoints)3) - { - case ReferencePoints.Top: - offsetY = (-iconSize.Y + sprite.Size.Y) / 2; - break; - case ReferencePoints.VCenter: - break; - case ReferencePoints.Bottom: - offsetY = (iconSize.Y - sprite.Size.Y) / 2; - break; - } - - switch (info.ReferencePoint & (ReferencePoints)(3 << 2)) - { - case ReferencePoints.Left: - offsetX = (-iconSize.X + sprite.Size.X) / 2; - break; - case ReferencePoints.HCenter: - break; - case ReferencePoints.Right: - offsetX = (iconSize.X - sprite.Size.X) / 2; - break; - } - - return new float2(offsetX, offsetY) + info.Offset; - } - - public bool IsOverlayActive(ActorInfo ai) + bool IProductionIconOverlay.IsOverlayActive(ActorInfo ai) { bool isActive; - overlayActive.TryGetValue(ai, out isActive); + if (!overlayActive.TryGetValue(ai, out isActive)) + return false; return isActive; } diff --git a/OpenRA.Mods.Common/TraitsInterfaces.cs b/OpenRA.Mods.Common/TraitsInterfaces.cs index a8b336a8e4..d23226482d 100644 --- a/OpenRA.Mods.Common/TraitsInterfaces.cs +++ b/OpenRA.Mods.Common/TraitsInterfaces.cs @@ -77,9 +77,8 @@ namespace OpenRA.Mods.Common.Traits public interface IProductionIconOverlay { - Sprite Sprite(); - string Palette(); - float Scale(); + Sprite Sprite { get; } + string Palette { get; } float2 Offset(float2 iconSize); bool IsOverlayActive(ActorInfo ai); } diff --git a/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs b/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs index 81d69d5a62..3391274d74 100644 --- a/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs +++ b/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs @@ -14,6 +14,7 @@ using System.Drawing; using System.Globalization; using System.Linq; using OpenRA.Graphics; +using OpenRA.Traits; namespace OpenRA.Mods.Common.UtilityCommands { @@ -2702,6 +2703,67 @@ namespace OpenRA.Mods.Common.UtilityCommands node.Value.Nodes.Add(new MiniYamlNode("ParticleSize", "1, 1")); } + // Overhauled the actor decorations traits + if (engineVersion < 20151226) + { + if (depth == 1 && (node.Key.StartsWith("WithDecoration") || node.Key.StartsWith("WithRankDecoration"))) + { + node.Value.Nodes.RemoveAll(n => n.Key == "Scale"); + node.Value.Nodes.RemoveAll(n => n.Key == "Offset"); + var sd = node.Value.Nodes.FirstOrDefault(n => n.Key == "SelectionDecoration"); + if (sd != null) + sd.Key = "RequiresSelection"; + + var reference = node.Value.Nodes.FirstOrDefault(n => n.Key == "ReferencePoint"); + if (reference != null) + { + var values = FieldLoader.GetValue("ReferencePoint", reference.Value.Value); + values = values.Where(v => v != "HCenter" && v != "VCenter").ToArray(); + if (values.Length == 0) + values = new[] { "Center" }; + + reference.Value.Value = FieldSaver.FormatValue(values); + } + + var stance = Stance.Ally; + var showToAllies = node.Value.Nodes.FirstOrDefault(n => n.Key == "ShowToAllies"); + if (showToAllies != null && !FieldLoader.GetValue("ShowToAllies", showToAllies.Value.Value)) + stance ^= Stance.Ally; + var showToEnemies = node.Value.Nodes.FirstOrDefault(n => n.Key == "ShowToEnemies"); + if (showToEnemies != null && FieldLoader.GetValue("ShowToEnemies", showToEnemies.Value.Value)) + stance |= Stance.Enemy; + + if (stance != Stance.Ally) + node.Value.Nodes.Add(new MiniYamlNode("Stance", FieldSaver.FormatValue(stance))); + + node.Value.Nodes.RemoveAll(n => n.Key == "ShowToAllies"); + node.Value.Nodes.RemoveAll(n => n.Key == "ShowToEnemies"); + } + + if (depth == 1 && node.Key == "Fake") + { + node.Key = "WithDecoration@fake"; + node.Value.Nodes.Add(new MiniYamlNode("RequiresSelection", "true")); + node.Value.Nodes.Add(new MiniYamlNode("Image", "pips")); + node.Value.Nodes.Add(new MiniYamlNode("Sequence", "tag-fake")); + node.Value.Nodes.Add(new MiniYamlNode("ReferencePoint", "Top")); + node.Value.Nodes.Add(new MiniYamlNode("ZOffset", "256")); + } + + if (depth == 0 && node.Value.Nodes.Any(n => n.Key.StartsWith("PrimaryBuilding"))) + { + var decNodes = new List(); + decNodes.Add(new MiniYamlNode("RequiresSelection", "true")); + decNodes.Add(new MiniYamlNode("Image", "pips")); + decNodes.Add(new MiniYamlNode("Sequence", "tag-primary")); + decNodes.Add(new MiniYamlNode("ReferencePoint", "Top")); + decNodes.Add(new MiniYamlNode("ZOffset", "256")); + decNodes.Add(new MiniYamlNode("UpgradeTypes", "primary")); + decNodes.Add(new MiniYamlNode("UpgradeMinEnabledLevel", "1")); + node.Value.Nodes.Add(new MiniYamlNode("WithDecoration@primary", new MiniYaml("", decNodes))); + } + } + UpgradeActorRules(engineVersion, ref node.Value.Nodes, node, depth + 1); } } diff --git a/OpenRA.Mods.Common/Widgets/ObserverProductionIconsWidget.cs b/OpenRA.Mods.Common/Widgets/ObserverProductionIconsWidget.cs index a36203143e..13bc78a887 100644 --- a/OpenRA.Mods.Common/Widgets/ObserverProductionIconsWidget.cs +++ b/OpenRA.Mods.Common/Widgets/ObserverProductionIconsWidget.cs @@ -91,10 +91,11 @@ namespace OpenRA.Mods.Common.Widgets var location = new float2(RenderBounds.Location) + new float2(queue.i * (IconWidth + IconSpacing), 0); WidgetUtils.DrawSHPCentered(icon.Image, location + 0.5f * iconSize, worldRenderer.Palette(bi.IconPalette), 0.5f); - var pio = queue.Trait.Actor.Owner.PlayerActor.TraitsImplementing().FirstOrDefault(); - if (pio != null && pio.IsOverlayActive(actor)) - WidgetUtils.DrawSHPCentered(pio.Sprite(), location + 0.5f * iconSize + pio.Offset(0.5f * iconSize), - worldRenderer.Palette(pio.Palette()), 0.5f * pio.Scale()); + var pio = queue.Trait.Actor.Owner.PlayerActor.TraitsImplementing() + .FirstOrDefault(p => p.IsOverlayActive(actor)); + if (pio != null) + WidgetUtils.DrawSHPCentered(pio.Sprite, location + 0.5f * iconSize + pio.Offset(0.5f * iconSize), + worldRenderer.Palette(pio.Palette), 0.5f); var clock = clocks[queue.Trait]; clock.PlayFetchIndex(ClockSequence, diff --git a/OpenRA.Mods.Common/Widgets/ProductionPaletteWidget.cs b/OpenRA.Mods.Common/Widgets/ProductionPaletteWidget.cs index 750848a9be..c4a5e5339f 100644 --- a/OpenRA.Mods.Common/Widgets/ProductionPaletteWidget.cs +++ b/OpenRA.Mods.Common/Widgets/ProductionPaletteWidget.cs @@ -374,8 +374,7 @@ namespace OpenRA.Mods.Common.Widgets var buildableItems = CurrentQueue.BuildableItems(); - var pio = currentQueue.Actor.Owner.PlayerActor.TraitsImplementing().FirstOrDefault(); - var pioOffset = pio != null ? pio.Offset(IconSize) : new float2(0, 0); + var pios = currentQueue.Actor.Owner.PlayerActor.TraitsImplementing(); // Icons foreach (var icon in icons.Values) @@ -383,8 +382,9 @@ namespace OpenRA.Mods.Common.Widgets WidgetUtils.DrawSHPCentered(icon.Sprite, icon.Pos + iconOffset, icon.Palette); // Draw the ProductionIconOverlay's sprite - if (pio != null && pio.IsOverlayActive(icon.Actor)) - WidgetUtils.DrawSHPCentered(pio.Sprite(), icon.Pos + iconOffset + pioOffset, worldRenderer.Palette(pio.Palette()), pio.Scale()); + var pio = pios.FirstOrDefault(p => p.IsOverlayActive(icon.Actor)); + if (pio != null) + WidgetUtils.DrawSHPCentered(pio.Sprite, icon.Pos + iconOffset + pio.Offset(IconSize), worldRenderer.Palette(pio.Palette), 1f); // Build progress if (icon.Queued.Count > 0) diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj index aa84c96aa3..938442d852 100644 --- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj +++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj @@ -86,7 +86,6 @@ - diff --git a/OpenRA.Mods.RA/Traits/Buildings/Fake.cs b/OpenRA.Mods.RA/Traits/Buildings/Fake.cs deleted file mode 100644 index 0f6c1b8dfc..0000000000 --- a/OpenRA.Mods.RA/Traits/Buildings/Fake.cs +++ /dev/null @@ -1,23 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2007-2015 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. For more information, - * see COPYING. - */ -#endregion - -using System.Collections.Generic; -using OpenRA.Traits; - -namespace OpenRA.Mods.RA.Traits -{ - [Desc("Display a sprite tag \"fake\" when selected.")] - class FakeInfo : TraitInfo { } - - class Fake : ITags - { - public IEnumerable GetTags() { yield return TagType.Fake; } - } -} diff --git a/mods/cnc/rules/defaults.yaml b/mods/cnc/rules/defaults.yaml index b8c216af15..7e5ca40f69 100644 --- a/mods/cnc/rules/defaults.yaml +++ b/mods/cnc/rules/defaults.yaml @@ -48,7 +48,6 @@ Sequence: rank Palette: effect ReferencePoint: Bottom, Right - Offset: 2, 2 UpgradeTypes: rank ZOffset: 256 UpgradeMinEnabledLevel: 1 diff --git a/mods/d2k/rules/defaults.yaml b/mods/d2k/rules/defaults.yaml index 689e59978d..93b3974a14 100644 --- a/mods/d2k/rules/defaults.yaml +++ b/mods/d2k/rules/defaults.yaml @@ -48,7 +48,6 @@ Sequence: rank Palette: effect ReferencePoint: Bottom, Right - Offset: 2, 2 UpgradeTypes: rank ZOffset: 256 UpgradeMinEnabledLevel: 1 diff --git a/mods/d2k/rules/structures.yaml b/mods/d2k/rules/structures.yaml index 6ffa3bae67..fd6b207857 100644 --- a/mods/d2k/rules/structures.yaml +++ b/mods/d2k/rules/structures.yaml @@ -88,13 +88,21 @@ construction_yard: Prerequisites: upgrade.conyard Upgrades: stardecoration WithDecoration@upgraded: - SelectionDecoration: true + RequiresSelection: true Image: pips Sequence: tag-upgraded ReferencePoint: Top, Right ZOffset: 256 UpgradeTypes: stardecoration UpgradeMinEnabledLevel: 1 + WithDecoration@primary: + RequiresSelection: true + Image: pips + Sequence: tag-primary + ReferencePoint: Top + ZOffset: 256 + UpgradeTypes: primary + UpgradeMinEnabledLevel: 1 wind_trap: Inherits: ^Building @@ -191,13 +199,21 @@ barracks: Prerequisites: upgrade.barracks Upgrades: stardecoration WithDecoration@upgraded: - SelectionDecoration: true + RequiresSelection: true Image: pips Sequence: tag-upgraded ReferencePoint: Top, Right ZOffset: 256 UpgradeTypes: stardecoration UpgradeMinEnabledLevel: 1 + WithDecoration@primary: + RequiresSelection: true + Image: pips + Sequence: tag-primary + ReferencePoint: Top + ZOffset: 256 + UpgradeTypes: primary + UpgradeMinEnabledLevel: 1 refinery: Inherits: ^Building @@ -359,13 +375,21 @@ light_factory: Prerequisites: upgrade.light Upgrades: stardecoration WithDecoration@upgraded: - SelectionDecoration: true + RequiresSelection: true Image: pips Sequence: tag-upgraded ReferencePoint: Top, Right ZOffset: 256 UpgradeTypes: stardecoration UpgradeMinEnabledLevel: 1 + WithDecoration@primary: + RequiresSelection: true + Image: pips + Sequence: tag-primary + ReferencePoint: Top + ZOffset: 256 + UpgradeTypes: primary + UpgradeMinEnabledLevel: 1 heavy_factory: Inherits: ^Building @@ -432,13 +456,21 @@ heavy_factory: Prerequisites: upgrade.heavy Upgrades: stardecoration WithDecoration@upgraded: - SelectionDecoration: true + RequiresSelection: true Image: pips Sequence: tag-upgraded ReferencePoint: Top, Right ZOffset: 256 UpgradeTypes: stardecoration UpgradeMinEnabledLevel: 1 + WithDecoration@primary: + RequiresSelection: true + Image: pips + Sequence: tag-primary + ReferencePoint: Top + ZOffset: 256 + UpgradeTypes: primary + UpgradeMinEnabledLevel: 1 outpost: Inherits: ^Building @@ -541,6 +573,14 @@ starport: Power: Amount: -150 ProvidesPrerequisite@buildingname: + WithDecoration@primary: + RequiresSelection: true + Image: pips + Sequence: tag-primary + ReferencePoint: Top + ZOffset: 256 + UpgradeTypes: primary + UpgradeMinEnabledLevel: 1 wall: Inherits@1: ^SpriteActor @@ -782,7 +822,7 @@ high_tech_factory: Prerequisites: upgrade.hightech Upgrades: stardecoration WithDecoration@upgraded: - SelectionDecoration: true + RequiresSelection: true Image: pips Sequence: tag-upgraded ReferencePoint: Top, Right diff --git a/mods/d2k/sequences/misc.yaml b/mods/d2k/sequences/misc.yaml index 27381d3d54..09f3da8204 100644 --- a/mods/d2k/sequences/misc.yaml +++ b/mods/d2k/sequences/misc.yaml @@ -107,6 +107,7 @@ pips: pickup-indicator: DATA.R8 Start: 112 tag-primary: primary.shp + Offset: 0, 2 pip-empty: DATA.R8 Start: 15 pip-green: DATA.R8 diff --git a/mods/ra/rules/defaults.yaml b/mods/ra/rules/defaults.yaml index 1a9b053632..798ebf032f 100644 --- a/mods/ra/rules/defaults.yaml +++ b/mods/ra/rules/defaults.yaml @@ -47,7 +47,6 @@ Sequence: rank Palette: effect ReferencePoint: Bottom, Right - Offset: 2, 2 UpgradeTypes: rank ZOffset: 256 UpgradeMinEnabledLevel: 1 @@ -521,7 +520,12 @@ DamageThreshold: 90 RevealsShroud: Range: 4c0 - Fake: + WithDecoration@fake: + RequiresSelection: true + Image: pips + Sequence: tag-fake + ReferencePoint: Top + ZOffset: 256 -EmitInfantryOnSell: -MustBeDestroyed: diff --git a/mods/ra/rules/infantry.yaml b/mods/ra/rules/infantry.yaml index 8c1461e515..59e1d52dd2 100644 --- a/mods/ra/rules/infantry.yaml +++ b/mods/ra/rules/infantry.yaml @@ -218,7 +218,6 @@ SPY: Sequence: pip-disguise Palette: effect ReferencePoint: Top, Right - Offset: 4, -2 ZOffset: 256 UpgradeTypes: disguise UpgradeMinEnabledLevel: 1 diff --git a/mods/ra/rules/player.yaml b/mods/ra/rules/player.yaml index 59c823338f..9361dd786e 100644 --- a/mods/ra/rules/player.yaml +++ b/mods/ra/rules/player.yaml @@ -66,7 +66,6 @@ Player: GlobalUpgradeManager: EnemyWatcher: VeteranProductionIconOverlay: - Offset: 2, 2 Image: iconchevrons Sequence: veteran diff --git a/mods/ra/rules/structures.yaml b/mods/ra/rules/structures.yaml index 39563ed088..4f0210afb7 100644 --- a/mods/ra/rules/structures.yaml +++ b/mods/ra/rules/structures.yaml @@ -169,6 +169,14 @@ SPEN: ProvidesPrerequisite@buildingname: EditorTilesetFilter: ExcludeTilesets: INTERIOR + WithDecoration@primary: + RequiresSelection: true + Image: pips + Sequence: tag-primary + ReferencePoint: Top + ZOffset: 256 + UpgradeTypes: primary + UpgradeMinEnabledLevel: 1 SYRD: Inherits: ^Building @@ -256,6 +264,14 @@ SYRD: ProvidesPrerequisite@buildingname: EditorTilesetFilter: ExcludeTilesets: INTERIOR + WithDecoration@primary: + RequiresSelection: true + Image: pips + Sequence: tag-primary + ReferencePoint: Top + ZOffset: 256 + UpgradeTypes: primary + UpgradeMinEnabledLevel: 1 IRON: Inherits: ^ScienceBuilding @@ -845,6 +861,14 @@ WEAP: TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate InfiltrateForSupportPower: Proxy: vehicles.upgraded + WithDecoration@primary: + RequiresSelection: true + Image: pips + Sequence: tag-primary + ReferencePoint: Top + ZOffset: 256 + UpgradeTypes: primary + UpgradeMinEnabledLevel: 1 FACT: Inherits: ^Building @@ -1074,6 +1098,14 @@ HPAD: TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate InfiltrateForSupportPower: Proxy: aircraft.upgraded + WithDecoration@primary: + RequiresSelection: true + Image: pips + Sequence: tag-primary + ReferencePoint: Top + ZOffset: 256 + UpgradeTypes: primary + UpgradeMinEnabledLevel: 1 AFLD: Inherits: ^Building @@ -1183,6 +1215,14 @@ AFLD: TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate InfiltrateForSupportPower: Proxy: aircraft.upgraded + WithDecoration@primary: + RequiresSelection: true + Image: pips + Sequence: tag-primary + ReferencePoint: Top + ZOffset: 256 + UpgradeTypes: primary + UpgradeMinEnabledLevel: 1 POWR: Inherits: ^Building @@ -1354,6 +1394,14 @@ BARR: Proxy: barracks.upgraded Targetable: TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate + WithDecoration@primary: + RequiresSelection: true + Image: pips + Sequence: tag-primary + ReferencePoint: Top + ZOffset: 256 + UpgradeTypes: primary + UpgradeMinEnabledLevel: 1 KENN: Inherits: ^Building @@ -1394,6 +1442,14 @@ KENN: ProvidesPrerequisite@buildingname: WithBuildingExplosion: Sequences: building, building_napalm, large_explosion, self_destruct + WithDecoration@primary: + RequiresSelection: true + Image: pips + Sequence: tag-primary + ReferencePoint: Top + ZOffset: 256 + UpgradeTypes: primary + UpgradeMinEnabledLevel: 1 TENT: Inherits: ^Building @@ -1466,6 +1522,14 @@ TENT: Proxy: barracks.upgraded Targetable: TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate + WithDecoration@primary: + RequiresSelection: true + Image: pips + Sequence: tag-primary + ReferencePoint: Top + ZOffset: 256 + UpgradeTypes: primary + UpgradeMinEnabledLevel: 1 FIX: Inherits: ^Building diff --git a/mods/ra/sequences/misc.yaml b/mods/ra/sequences/misc.yaml index fa64748390..ef386805f5 100644 --- a/mods/ra/sequences/misc.yaml +++ b/mods/ra/sequences/misc.yaml @@ -57,8 +57,10 @@ pips: # Start: 4 tag-fake: Start: 18 + Offset: 0, 2 tag-primary: Start: 2 + Offset: 0, 2 pip-empty: pips2 pip-green: pips2 Start: 1 @@ -73,6 +75,7 @@ pips: pip-disguise: pip-disguise Length: * Tick: 300 + Offset: 0, -6 v2: idle: @@ -370,6 +373,7 @@ rank: iconchevrons: veteran: + Offset: 2, 2 atomic: up: atomicup diff --git a/mods/ts/rules/civilian-infantry.yaml b/mods/ts/rules/civilian-infantry.yaml index 6affd0532c..6e2d74cfb9 100644 --- a/mods/ts/rules/civilian-infantry.yaml +++ b/mods/ts/rules/civilian-infantry.yaml @@ -65,7 +65,6 @@ CHAMSPY: Sequence: pip-disguise Palette: pips ReferencePoint: Top, Right - Offset: 4, -2 ZOffset: 256 UpgradeTypes: disguise UpgradeMinEnabledLevel: 1 diff --git a/mods/ts/rules/defaults.yaml b/mods/ts/rules/defaults.yaml index e6037d6b2a..0da8cfcfaa 100644 --- a/mods/ts/rules/defaults.yaml +++ b/mods/ts/rules/defaults.yaml @@ -44,7 +44,6 @@ Sequence: rank Palette: ra ReferencePoint: Bottom, Right - Offset: 2, 2 UpgradeTypes: rank ZOffset: 256 UpgradeMinEnabledLevel: 1 @@ -61,10 +60,8 @@ TimedUpgradeBar@EMPDISABLE: Upgrade: empdisable Color: FFFFFF - WithDecoration@EMPDISABLE: - Image: emp - Sequence: idle - ReferencePoint: HCenter, VCenter + WithIdleOverlay@EMPDISABLE: + Sequence: emp-overlay Palette: effect UpgradeTypes: empdisable ShowToEnemies: true @@ -456,7 +453,6 @@ ^CivilianVoxelVehicle: Inherits: ^VoxelVehicle - -RenderSprites: -MustBeDestroyed: ^Aircraft: @@ -666,6 +662,7 @@ Inherits@1: ^EmpDisableMobile Inherits@2: ^ExistsInWorld RenderVoxels: + RenderSprites: WithVoxelBody: DrawLineToTarget: Mobile: diff --git a/mods/ts/rules/gdi-structures.yaml b/mods/ts/rules/gdi-structures.yaml index 7bea3f31d9..dff7090b89 100644 --- a/mods/ts/rules/gdi-structures.yaml +++ b/mods/ts/rules/gdi-structures.yaml @@ -108,6 +108,15 @@ GAPILE: ProvidesPrerequisite@buildingname: SelectionDecorations: VisualBounds: 88, 56, 0, -8 + WithDecoration@primary: + RequiresSelection: true + Image: pips + Sequence: tag-primary + Palette: ra + ReferencePoint: Top + ZOffset: 256 + UpgradeTypes: primary + UpgradeMinEnabledLevel: 1 GAWEAP: Inherits: ^Building @@ -159,6 +168,15 @@ GAWEAP: ProvidesPrerequisite@buildingname: SelectionDecorations: VisualBounds: 154, 100, -2, -12 + WithDecoration@primary: + RequiresSelection: true + Image: pips + Sequence: tag-primary + Palette: ra + ReferencePoint: Top + ZOffset: 256 + UpgradeTypes: primary + UpgradeMinEnabledLevel: 1 GAHPAD: Inherits: ^Building @@ -203,6 +221,15 @@ GAHPAD: ProvidesPrerequisite@buildingname: SelectionDecorations: VisualBounds: 88, 66, 0, -5 + WithDecoration@primary: + RequiresSelection: true + Image: pips + Sequence: tag-primary + Palette: ra + ReferencePoint: Top + ZOffset: 256 + UpgradeTypes: primary + UpgradeMinEnabledLevel: 1 GADEPT: Inherits: ^Building diff --git a/mods/ts/rules/nod-structures.yaml b/mods/ts/rules/nod-structures.yaml index 39db5143d0..ad23525a1a 100644 --- a/mods/ts/rules/nod-structures.yaml +++ b/mods/ts/rules/nod-structures.yaml @@ -116,6 +116,15 @@ NAHAND: ProvidesPrerequisite@buildingname: SelectionDecorations: VisualBounds: 116, 78, 3, -8 + WithDecoration@primary: + RequiresSelection: true + Image: pips + Sequence: tag-primary + Palette: ra + ReferencePoint: Top + ZOffset: 256 + UpgradeTypes: primary + UpgradeMinEnabledLevel: 1 NAWEAP: Inherits: ^Building @@ -163,6 +172,15 @@ NAWEAP: ProvidesPrerequisite@buildingname: SelectionDecorations: VisualBounds: 149, 116, -3, -20 + WithDecoration@primary: + RequiresSelection: true + Image: pips + Sequence: tag-primary + Palette: ra + ReferencePoint: Top + ZOffset: 256 + UpgradeTypes: primary + UpgradeMinEnabledLevel: 1 NAHPAD: Inherits: ^Building @@ -207,6 +225,15 @@ NAHPAD: ProvidesPrerequisite@buildingname: SelectionDecorations: VisualBounds: 78, 54, 0, -8 + WithDecoration@primary: + RequiresSelection: true + Image: pips + Sequence: tag-primary + Palette: ra + ReferencePoint: Top + ZOffset: 256 + UpgradeTypes: primary + UpgradeMinEnabledLevel: 1 NARADR: Inherits: ^Building @@ -406,3 +433,4 @@ NAWAST: SelectionDecorations: VisualBounds: 100, 60, 5, -5 RenderSprites: + diff --git a/mods/ts/sequences/civilian.yaml b/mods/ts/sequences/civilian.yaml index 878e1ed3b3..5025e70b53 100644 --- a/mods/ts/sequences/civilian.yaml +++ b/mods/ts/sequences/civilian.yaml @@ -919,6 +919,12 @@ gaspot: make: gaspotmk Length: 14 ShadowStart: 14 + emp-overlay: emp_fx01 + Length: * + Offset: 0, 0 + UseTilesetCode: false + ZOffset: 512 + BlendMode: Additive icon: spoticon Offset: 0, 0 UseTilesetCode: false @@ -935,6 +941,12 @@ galite: lighting: alphatst BlendMode: DoubleMultiplicative UseTilesetCode: false + emp-overlay: emp_fx01 + Length: * + Offset: 0, 0 + UseTilesetCode: false + ZOffset: 512 + BlendMode: Additive icon: liteicon Offset: 0, 0 UseTilesetCode: false diff --git a/mods/ts/sequences/infantry.yaml b/mods/ts/sequences/infantry.yaml index 3bd73c540b..52411d9e59 100644 --- a/mods/ts/sequences/infantry.yaml +++ b/mods/ts/sequences/infantry.yaml @@ -953,6 +953,10 @@ cyc2: ShadowStart: 190 die6: electro Length: * + emp-overlay: emp_fx01 + Length: * + ZOffset: 512 + BlendMode: Additive icon: cybcicon cyborg: @@ -1014,6 +1018,10 @@ cyborg: ShadowStart: 662 die6: electro Length: * + emp-overlay: emp_fx01 + Length: * + ZOffset: 512 + BlendMode: Additive icon: cybiicon mutant: diff --git a/mods/ts/sequences/misc.yaml b/mods/ts/sequences/misc.yaml index 1934ea51b1..1f3f813254 100644 --- a/mods/ts/sequences/misc.yaml +++ b/mods/ts/sequences/misc.yaml @@ -90,6 +90,7 @@ pips: Length: 10 tag-primary: pipsra #TODO: backfall to RA asset Start: 2 + Offset: 0, 2 pip-empty: pips2 pip-green: pips2 Start: 1 @@ -107,6 +108,8 @@ pips: pip-disguise: pip-disguise Length: * Tick: 300 + Offset: 0, -6 + # TODO: pip-empty-building: pip-green-building: @@ -244,11 +247,6 @@ wake: Length: * Tick: 180 -emp: - idle: emp_fx01 - Length: * - BlendMode: Additive - resources: Defaults: UseTilesetExtension: true diff --git a/mods/ts/sequences/structures.yaml b/mods/ts/sequences/structures.yaml index e34e2cb771..22bbce2af9 100644 --- a/mods/ts/sequences/structures.yaml +++ b/mods/ts/sequences/structures.yaml @@ -40,6 +40,12 @@ gacnst: Length: 10 damaged-idle-front: gtcnst_b Length: 10 + emp-overlay: emp_fx01 + Length: * + Offset: 0, 0 + UseTilesetCode: false + ZOffset: 512 + BlendMode: Additive icon: facticon Offset: 0,0 UseTilesetCode: false @@ -89,6 +95,12 @@ gapowr: make: gtpowrmk Length: 20 ShadowStart: 20 + emp-overlay: emp_fx01 + Length: * + Offset: 0, 0 + UseTilesetCode: false + ZOffset: 512 + BlendMode: Additive icon: powricon Offset: 0, 0 UseTilesetCode: false @@ -133,6 +145,12 @@ gapile: make: gtpilemk Length: 20 ShadowStart: 20 + emp-overlay: emp_fx01 + Length: * + Offset: 0, 0 + UseTilesetCode: false + ZOffset: 512 + BlendMode: Additive icon: brrkicon Offset: 0, 0 UseTilesetCode: false @@ -204,6 +222,12 @@ gaweap: Start: 2 Length: 1 ZOffset: -1024 + emp-overlay: emp_fx01 + Length: * + Offset: 0, 0 + UseTilesetCode: false + ZOffset: 512 + BlendMode: Additive icon: weapicon Offset: 0, 0 UseTilesetCode: false @@ -231,6 +255,12 @@ napowr: make: ntpowrmk Length: 19 ShadowStart: 19 + emp-overlay: emp_fx01 + Length: * + Offset: 0, 0 + UseTilesetCode: false + ZOffset: 512 + BlendMode: Additive icon: npwricon Offset: 0, 0 UseTilesetCode: false @@ -258,6 +288,12 @@ naapwr: make: ntapwrmk Length: 19 ShadowStart: 19 + emp-overlay: emp_fx01 + Length: * + Offset: 0, 0 + UseTilesetCode: false + ZOffset: 512 + BlendMode: Additive icon: apwricon Offset: 0, 0 UseTilesetCode: false @@ -294,6 +330,12 @@ nahand: make: nthandmk Length: 15 ShadowStart: 15 + emp-overlay: emp_fx01 + Length: * + Offset: 0, 0 + UseTilesetCode: false + ZOffset: 512 + BlendMode: Additive icon: handicon Offset: 0, 0 UseTilesetCode: false @@ -350,6 +392,12 @@ naweap: dead-bib: ntweapbb Start: 2 ZOffset: -1024 + emp-overlay: emp_fx01 + Length: * + Offset: 0, 0 + UseTilesetCode: false + ZOffset: 512 + BlendMode: Additive icon: nwepicon Offset: 0, 0 UseTilesetCode: false @@ -377,6 +425,12 @@ naradr: make: ntradrmk Length: 20 ShadowStart: 20 + emp-overlay: emp_fx01 + Length: * + Offset: 0, 0 + UseTilesetCode: false + ZOffset: 512 + BlendMode: Additive icon: nradicon Offset: 0, 0 UseTilesetCode: false @@ -403,6 +457,12 @@ natech: make: nttechmk Length: 18 ShadowStart: 18 + emp-overlay: emp_fx01 + Length: * + Offset: 0, 0 + UseTilesetCode: false + ZOffset: 512 + BlendMode: Additive icon: ntchicon Offset: 0, 0 UseTilesetCode: false @@ -430,6 +490,12 @@ natmpl: make: nttmplmk Length: 17 ShadowStart: 17 + emp-overlay: emp_fx01 + Length: * + Offset: 0, 0 + UseTilesetCode: false + ZOffset: 512 + BlendMode: Additive icon: tmplicon Offset: 0, 0 UseTilesetCode: false @@ -459,6 +525,12 @@ garadr: make: gtradrmk Length: 20 ShadowStart: 20 + emp-overlay: emp_fx01 + Length: * + Offset: 0, 0 + UseTilesetCode: false + ZOffset: 512 + BlendMode: Additive icon: radricon Offset: 0, 0 UseTilesetCode: false @@ -486,6 +558,12 @@ gatech: make: gttechmk Length: 20 ShadowStart: 20 + emp-overlay: emp_fx01 + Length: * + Offset: 0, 0 + UseTilesetCode: false + ZOffset: 512 + BlendMode: Additive icon: techicon Offset: 0, 0 UseTilesetCode: false @@ -556,6 +634,12 @@ gatick: Length: * Offset: 0, 0 UseTilesetCode: false + emp-overlay: emp_fx01 + Length: * + Offset: 0, 0 + UseTilesetCode: false + ZOffset: 512 + BlendMode: Additive make: gatickmk Length: 24 ShadowStart: 24 @@ -569,6 +653,12 @@ gaicbm: damaged-idle: Start: 1 ShadowStart: 4 + emp-overlay: emp_fx01 + Length: * + Offset: 0, 0 + UseTilesetCode: false + ZOffset: 512 + BlendMode: Additive make: gaicbmmk Length: 30 ShadowStart: 30 @@ -586,6 +676,12 @@ gaarty: Length: * Offset: 0, 0 UseTilesetCode: false + emp-overlay: emp_fx01 + Length: * + Offset: 0, 0 + UseTilesetCode: false + ZOffset: 512 + BlendMode: Additive make: gaartymk Length: 16 ShadowStart: 16 @@ -613,6 +709,12 @@ naobel: make: ntobelmk Length: 19 ShadowStart: 19 + emp-overlay: emp_fx01 + Length: * + Offset: 0, 0 + UseTilesetCode: false + ZOffset: 512 + BlendMode: Additive icon: obliicon Offset: 0, 0 UseTilesetCode: false @@ -633,6 +735,12 @@ nalasr: make: ntlasrmk Length: 21 ShadowStart: 21 + emp-overlay: emp_fx01 + Length: * + Offset: 0, 0 + UseTilesetCode: false + ZOffset: 512 + BlendMode: Additive icon: plticon Offset: 0, 0 UseTilesetCode: false @@ -656,6 +764,12 @@ nasam: make: ntsammk Length: 8 ShadowStart: 8 + emp-overlay: emp_fx01 + Length: * + Offset: 0, 0 + UseTilesetCode: false + ZOffset: 512 + BlendMode: Additive icon: samicon Offset: 0, 0 UseTilesetCode: false @@ -678,6 +792,12 @@ napuls.gdi: make: ntpulsmk Length: 20 ShadowStart: 20 + emp-overlay: emp_fx01 + Length: * + Offset: 0, 0 + UseTilesetCode: false + ZOffset: 512 + BlendMode: Additive icon: sidec01.mix:empicon Offset: 0, 0 UseTilesetCode: false @@ -700,6 +820,12 @@ napuls.nod: make: ntpulsmk Length: 20 ShadowStart: 20 + emp-overlay: emp_fx01 + Length: * + Offset: 0, 0 + UseTilesetCode: false + ZOffset: 512 + BlendMode: Additive icon: sidec02.mix:empicon Offset: 0, 0 UseTilesetCode: false @@ -727,6 +853,12 @@ nastlh: make: ntstlhmk Length: 18 ShadowStart: 20 + emp-overlay: emp_fx01 + Length: * + Offset: 0, 0 + UseTilesetCode: false + ZOffset: 512 + BlendMode: Additive icon: clckicon Offset: 0, 0 UseTilesetCode: false @@ -784,6 +916,12 @@ gactwr: muzzle7: mgun-ne Length: * UseTilesetCode: false + emp-overlay: emp_fx01 + Length: * + Offset: 0, 0 + UseTilesetCode: false + ZOffset: 512 + BlendMode: Additive icon: towricon Offset: 0, 0 UseTilesetCode: false @@ -840,6 +978,12 @@ gahpad: Length: 18 ShadowStart: 18 ZOffset: -1c511 + emp-overlay: emp_fx01 + Length: * + Offset: 0, 0 + UseTilesetCode: false + ZOffset: 512 + BlendMode: Additive icon: heliicon Offset: 0, 0 UseTilesetCode: false @@ -884,6 +1028,12 @@ nahpad: make: nthpadmk Length: 20 ShadowStart: 20 + emp-overlay: emp_fx01 + Length: * + Offset: 0, 0 + UseTilesetCode: false + ZOffset: 512 + BlendMode: Additive icon: nhpdicon Offset: 0, 0 UseTilesetCode: false @@ -918,6 +1068,12 @@ proc.gdi: damaged-bib: ntrefnbb Start: 1 ZOffset: -1024 + emp-overlay: emp_fx01 + Length: * + Offset: 0, 0 + UseTilesetCode: false + ZOffset: 512 + BlendMode: Additive icon: sidec01.mix:reficon Offset: 0, 0 UseTilesetCode: false @@ -952,6 +1108,12 @@ proc.nod: damaged-bib: ntrefnbb Start: 1 ZOffset: -1024 + emp-overlay: emp_fx01 + Length: * + Offset: 0, 0 + UseTilesetCode: false + ZOffset: 512 + BlendMode: Additive icon: sidec02.mix:reficon Offset: 0, 0 UseTilesetCode: false @@ -993,6 +1155,12 @@ nawast: damaged-bib: ntwastbb Start: 1 ZOffset: -1024 + emp-overlay: emp_fx01 + Length: * + Offset: 0, 0 + UseTilesetCode: false + ZOffset: 512 + BlendMode: Additive icon: wasticon Offset: 0, 0 UseTilesetCode: false @@ -1031,6 +1199,12 @@ gasilo.gdi: make: gtsilomk Length: 18 ShadowStart: 20 + emp-overlay: emp_fx01 + Length: * + Offset: 0, 0 + UseTilesetCode: false + ZOffset: 512 + BlendMode: Additive icon: sidec01.mix:siloicon Offset: 0, 0 UseTilesetCode: false @@ -1069,6 +1243,12 @@ gasilo.nod: make: gtsilomk Length: 18 ShadowStart: 20 + emp-overlay: emp_fx01 + Length: * + Offset: 0, 0 + UseTilesetCode: false + ZOffset: 512 + BlendMode: Additive icon: sidec02.mix:siloicon Offset: 0, 0 UseTilesetCode: false @@ -1127,6 +1307,12 @@ gadept.gdi: Length: 10 Tick: 60 ShadowStart: 10 + emp-overlay: emp_fx01 + Length: * + Offset: 0, 0 + UseTilesetCode: false + ZOffset: 512 + BlendMode: Additive icon: sidec01.mix:fixicon Offset: 0, 0 UseTilesetCode: false @@ -1185,6 +1371,12 @@ gadept.nod: Length: 10 Tick: 60 ShadowStart: 10 + emp-overlay: emp_fx01 + Length: * + Offset: 0, 0 + UseTilesetCode: false + ZOffset: 512 + BlendMode: Additive icon: sidec02.mix:fixicon Offset: 76, 66 UseTilesetCode: false @@ -1216,6 +1408,12 @@ namisl: Start: 10 Length: 10 Tick: 80 + emp-overlay: emp_fx01 + Length: * + Offset: 0, 0 + UseTilesetCode: false + ZOffset: 512 + BlendMode: Additive icon: msslicon Offset: 0, 0 UseTilesetCode: false @@ -1275,6 +1473,12 @@ gaplug: make: gtplugmk Length: 17 ShadowStart: 17 + emp-overlay: emp_fx01 + Length: * + Offset: 0, 0 + UseTilesetCode: false + ZOffset: 512 + BlendMode: Additive icon: plugicon Offset: 0, 0 UseTilesetCode: false diff --git a/mods/ts/sequences/vehicles.yaml b/mods/ts/sequences/vehicles.yaml index 671610484a..4844ad4391 100644 --- a/mods/ts/sequences/vehicles.yaml +++ b/mods/ts/sequences/vehicles.yaml @@ -1,31 +1,51 @@ mcv.gdi: + emp-overlay: emp_fx01 + Length: * + BlendMode: Additive icon: sidec01.mix:mcvicon mcv.nod: + emp-overlay: emp_fx01 + Length: * + BlendMode: Additive icon: sidec02.mix:mcvicon apc: + emp-overlay: emp_fx01 + Length: * + BlendMode: Additive icon: apcicon harv.gdi: + emp-overlay: emp_fx01 + Length: * + BlendMode: Additive harvest: harvestr Length: * icon: sidec01.mix:harvicon harv.nod: + emp-overlay: emp_fx01 + Length: * + BlendMode: Additive harvest: harvestr Length: * icon: sidec02.mix:harvicon hvr: + emp-overlay: emp_fx01 + Length: * + BlendMode: Additive icon: hovricon 4tnk: + emp-overlay: emp_fx01 + Length: * + BlendMode: Additive muzzle: gunfire Length: * lpst.gdi: - icon: sidec01.mix:lpsticon idle: gadpsa Offset: 0, -12 ShadowStart: 3 @@ -33,9 +53,12 @@ lpst.gdi: Offset: 0, -12 Length: 36 ShadowStart: 36 + emp-overlay: emp_fx01 + Length: * + BlendMode: Additive + icon: sidec01.mix:lpsticon lpst.nod: - icon: sidec02.mix:lpsticon idle: gadpsa Offset: 0, -12 ShadowStart: 3 @@ -43,20 +66,39 @@ lpst.nod: Offset: 0, -12 Length: 36 ShadowStart: 36 + emp-overlay: emp_fx01 + Length: * + BlendMode: Additive + icon: sidec02.mix:lpsticon repair: + emp-overlay: emp_fx01 + Length: * + BlendMode: Additive icon: rboticon art2: + emp-overlay: emp_fx01 + Length: * + BlendMode: Additive icon: artyicon weed: + emp-overlay: emp_fx01 + Length: * + BlendMode: Additive icon: weedicon hmec: + emp-overlay: emp_fx01 + Length: * + BlendMode: Additive icon: hmecicon bike: + emp-overlay: emp_fx01 + Length: * + BlendMode: Additive icon: cyclicon bggy: @@ -70,23 +112,40 @@ bggy: muzzle5: mgun-se muzzle6: mgun-e muzzle7: mgun-ne + emp-overlay: emp_fx01 + BlendMode: Additive icon: bggyicon sapc: + emp-overlay: emp_fx01 + Length: * + BlendMode: Additive icon: sapcicon subtank: + emp-overlay: emp_fx01 + Length: * + BlendMode: Additive icon: subticon sonic: + emp-overlay: emp_fx01 + Length: * + BlendMode: Additive icon: soniicon ttnk: muzzle: gunfire Length: * + emp-overlay: emp_fx01 + Length: * + BlendMode: Additive icon: tickicon stnk: + emp-overlay: emp_fx01 + Length: * + BlendMode: Additive icon: stnkicon mmch: @@ -103,6 +162,9 @@ mmch: Facings: -32 muzzle: gunfire Length: * + emp-overlay: emp_fx01 + Length: * + BlendMode: Additive icon: mmchicon gghunt: @@ -110,6 +172,9 @@ gghunt: Facings: 1 Length: 8 ShadowStart: 8 + emp-overlay: emp_fx01 + Length: * + BlendMode: Additive smech: stand: @@ -126,4 +191,67 @@ smech: Facings: -8 ShadowStart: 240 Tick: 100 + emp-overlay: emp_fx01 + Length: * + BlendMode: Additive icon: smchicon + +trucka: + emp-overlay: emp_fx01 + Length: * + ZOffset: 512 + BlendMode: Additive + +truckb: + emp-overlay: emp_fx01 + Length: * + ZOffset: 512 + BlendMode: Additive + +icbm: + emp-overlay: emp_fx01 + Length: * + ZOffset: 512 + BlendMode: Additive + +bus: + emp-overlay: emp_fx01 + Length: * + ZOffset: 512 + BlendMode: Additive + +pick: + emp-overlay: emp_fx01 + Length: * + ZOffset: 512 + BlendMode: Additive + +car: + emp-overlay: emp_fx01 + Length: * + ZOffset: 512 + BlendMode: Additive + +wini: + emp-overlay: emp_fx01 + Length: * + ZOffset: 512 + BlendMode: Additive + +locomotive: + emp-overlay: emp_fx01 + Length: * + ZOffset: 512 + BlendMode: Additive + +traincar: + emp-overlay: emp_fx01 + Length: * + ZOffset: 512 + BlendMode: Additive + +cargocar: + emp-overlay: emp_fx01 + Length: * + ZOffset: 512 + BlendMode: Additive