Merge pull request #10216 from pchote/remove-tags

Reimplement Primary and Fake tags using WithDecoration.
This commit is contained in:
Oliver Brakmann
2015-12-27 19:43:57 +01:00
31 changed files with 712 additions and 247 deletions

View File

@@ -17,14 +17,16 @@ namespace OpenRA.Graphics
public struct UISpriteRenderable : IRenderable, IFinalizedRenderable public struct UISpriteRenderable : IRenderable, IFinalizedRenderable
{ {
readonly Sprite sprite; readonly Sprite sprite;
readonly WPos effectiveWorldPos;
readonly int2 screenPos; readonly int2 screenPos;
readonly int zOffset; readonly int zOffset;
readonly PaletteReference palette; readonly PaletteReference palette;
readonly float scale; 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.sprite = sprite;
this.effectiveWorldPos = effectiveWorldPos;
this.screenPos = screenPos; this.screenPos = screenPos;
this.zOffset = zOffset; this.zOffset = zOffset;
this.palette = palette; this.palette = palette;
@@ -32,14 +34,14 @@ namespace OpenRA.Graphics
} }
// Does not exist in the world, so a world positions don't make sense // 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 WVec Offset { get { return WVec.Zero; } }
public bool IsDecoration { get { return true; } } public bool IsDecoration { get { return true; } }
public PaletteReference Palette { get { return palette; } } public PaletteReference Palette { get { return palette; } }
public int ZOffset { get { return zOffset; } } 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 WithZOffset(int newOffset) { return this; }
public IRenderable OffsetBy(WVec vec) { return this; } public IRenderable OffsetBy(WVec vec) { return this; }
public IRenderable AsDecoration() { return this; } public IRenderable AsDecoration() { return this; }

View File

@@ -35,7 +35,6 @@ namespace OpenRA.Traits
// depends on the order of pips in WorldRenderer.cs! // depends on the order of pips in WorldRenderer.cs!
public enum PipType { Transparent, Green, Yellow, Red, Gray, Blue, Ammo, AmmoEmpty } public enum PipType { Transparent, Green, Yellow, Red, Gray, Blue, Ammo, AmmoEmpty }
public enum TagType { None, Fake, Primary }
[Flags] [Flags]
public enum Stance 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 ILoadsPlayerPalettes { void LoadPlayerPalettes(WorldRenderer wr, string playerName, HSLColor playerColor, bool replaceExisting); }
public interface IPaletteModifier { void AdjustPalette(IReadOnlyDictionary<string, MutablePalette> b); } public interface IPaletteModifier { void AdjustPalette(IReadOnlyDictionary<string, MutablePalette> b); }
public interface IPips { IEnumerable<PipType> GetPips(Actor self); } public interface IPips { IEnumerable<PipType> GetPips(Actor self); }
public interface ITags { IEnumerable<TagType> GetTags(); }
public interface ISelectionBar { float GetValue(); Color GetColor(); } public interface ISelectionBar { float GetValue(); Color GetColor(); }
public interface IPositionableInfo : ITraitInfo { } public interface IPositionableInfo : ITraitInfo { }

View File

@@ -25,16 +25,25 @@ namespace OpenRA.Mods.Common.Traits
} }
[Desc("Used together with ClassicProductionQueue.")] [Desc("Used together with ClassicProductionQueue.")]
public class PrimaryBuildingInfo : TraitInfo<PrimaryBuilding> { } public class PrimaryBuildingInfo : ITraitInfo, Requires<UpgradeManagerInfo>
public class PrimaryBuilding : IIssueOrder, IResolveOrder, ITags
{ {
bool isPrimary = false; [UpgradeGrantedReference, Desc("The upgrades to grant while the primary building.")]
public bool IsPrimary { get { return isPrimary; } } public readonly string[] Upgrades = { "primary" };
public IEnumerable<TagType> GetTags() public object Create(ActorInitializer init) { return new PrimaryBuilding(init.Self, this); }
}
public class PrimaryBuilding : IIssueOrder, IResolveOrder
{ {
yield return isPrimary ? TagType.Primary : TagType.None; readonly PrimaryBuildingInfo info;
readonly UpgradeManager manager;
public bool IsPrimary { get; private set; }
public PrimaryBuilding(Actor self, PrimaryBuildingInfo info)
{
this.info = info;
manager = self.Trait<UpgradeManager>();
} }
public IEnumerable<IOrderTargeter> Orders public IEnumerable<IOrderTargeter> Orders
@@ -53,14 +62,16 @@ namespace OpenRA.Mods.Common.Traits
public void ResolveOrder(Actor self, Order order) public void ResolveOrder(Actor self, Order order)
{ {
if (order.OrderString == "PrimaryProducer") if (order.OrderString == "PrimaryProducer")
SetPrimaryProducer(self, !isPrimary); SetPrimaryProducer(self, !IsPrimary);
} }
public void SetPrimaryProducer(Actor self, bool state) public void SetPrimaryProducer(Actor self, bool state)
{ {
if (state == false) if (state == false)
{ {
isPrimary = false; IsPrimary = false;
foreach (var up in info.Upgrades)
manager.RevokeUpgrade(self, up, this);
return; return;
} }
@@ -78,7 +89,9 @@ namespace OpenRA.Mods.Common.Traits
b.Trait.SetPrimaryProducer(b.Actor, false); 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); Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", "PrimaryBuildingSelected", self.Owner.Faction.InternalName);
} }

View File

@@ -42,7 +42,6 @@ namespace OpenRA.Mods.Common.Traits
{ {
// depends on the order of pips in TraitsInterfaces.cs! // 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[] 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; public readonly SelectionDecorationsInfo Info;
readonly Actor self; readonly Actor self;
@@ -90,16 +89,12 @@ namespace OpenRA.Mods.Common.Traits
var pos = wr.ScreenPxPosition(self.CenterPosition); var pos = wr.ScreenPxPosition(self.CenterPosition);
var tl = wr.Viewport.WorldToViewPx(pos + new int2(b.Left, b.Top)); 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 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)) foreach (var r in DrawControlGroup(wr, self, tl))
yield return r; yield return r;
foreach (var r in DrawPips(wr, self, bl)) foreach (var r in DrawPips(wr, self, bl))
yield return r; yield return r;
foreach (var r in DrawTags(wr, self, tm))
yield return r;
} }
IEnumerable<IRenderable> DrawControlGroup(WorldRenderer wr, Actor self, int2 basePosition) IEnumerable<IRenderable> DrawControlGroup(WorldRenderer wr, Actor self, int2 basePosition)
@@ -114,7 +109,7 @@ namespace OpenRA.Mods.Common.Traits
pipImages.Tick(); pipImages.Tick();
var pos = basePosition - (0.5f * pipImages.Image.Size).ToInt2() + new int2(9, 5); 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<IRenderable> DrawPips(WorldRenderer wr, Actor self, int2 basePosition) IEnumerable<IRenderable> DrawPips(WorldRenderer wr, Actor self, int2 basePosition)
@@ -146,35 +141,12 @@ namespace OpenRA.Mods.Common.Traits
pipImages.PlayRepeating(PipStrings[(int)pip]); pipImages.PlayRepeating(PipStrings[(int)pip]);
pipxyOffset += new int2(pipSize.X, 0); 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 // Increment row
pipxyOffset = new int2(0, pipxyOffset.Y - (pipSize.Y + 1)); pipxyOffset = new int2(0, pipxyOffset.Y - (pipSize.Y + 1));
} }
} }
IEnumerable<IRenderable> 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<ITags>())
{
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);
}
}
}
} }
} }

View File

@@ -20,16 +20,14 @@ namespace OpenRA.Mods.Common.Traits
[Flags] [Flags]
public enum ReferencePoints public enum ReferencePoints
{ {
Top = 0, Center = 0,
VCenter = 1, Top = 1,
Bottom = 2, Bottom = 2,
Left = 4,
Left = 0 << 2, Right = 8,
HCenter = 1 << 2,
Right = 2 << 2,
} }
[Desc("Displays a custom animation if conditions are satisfied.")] [Desc("Displays a custom UI overlay relative to the selection box.")]
public class WithDecorationInfo : UpgradableTraitInfo public class WithDecorationInfo : UpgradableTraitInfo
{ {
[Desc("Image used for this decoration. Defaults to the actor's type.")] [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.")] [Desc("Palette to render the sprite in. Reference the world actor's PaletteFrom* traits.")]
[PaletteReference] public readonly string Palette = "chrome"; [PaletteReference] public readonly string Palette = "chrome";
[Desc("Point in the actor's bounding box used as reference for offsetting the decoration image. " + [Desc("Point in the actor's selection 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.")] "Possible values are combinations of Center, Top, Bottom, Left, Right.")]
public readonly ReferencePoints ReferencePoint = ReferencePoints.Top | ReferencePoints.Left; 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.")] [Desc("The Z offset to apply when rendering this decoration.")]
public readonly int ZOffset = 1; public readonly int ZOffset = 1;
[Desc("Visual scale of the image.")] [Desc("Player stances who can view the decoration.")]
public readonly float Scale = 1f; public readonly Stance Stances = Stance.Ally;
[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("Should this be visible only when selected?")] [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 override object Create(ActorInitializer init) { return new WithDecoration(init.Self, this); }
} }
public class WithDecoration : UpgradableTrait<WithDecorationInfo>, IRender, IPostRenderSelection public class WithDecoration : UpgradableTrait<WithDecorationInfo>, ITick, IRender, IPostRenderSelection
{ {
readonly WithDecorationInfo info; protected readonly Animation Anim;
readonly string image; readonly string image;
readonly Animation anim;
readonly Actor self; readonly Actor self;
public WithDecoration(Actor self, WithDecorationInfo info) public WithDecoration(Actor self, WithDecorationInfo info)
: base(info) : base(info)
{ {
this.info = info;
this.self = self; this.self = self;
image = info.Image ?? self.Info.Name; image = info.Image ?? self.Info.Name;
anim = new Animation(self.World, image, () => self.World.Paused); Anim = new Animation(self.World, image, () => self.World.Paused);
anim.PlayRepeating(info.Sequence); Anim.PlayRepeating(info.Sequence);
}
public void PlaySingleFrame(int frame)
{
anim.PlayFetchIndex(info.Sequence, () => frame);
} }
public virtual bool ShouldRender(Actor self) { return true; } public virtual bool ShouldRender(Actor self) { return true; }
public IEnumerable<IRenderable> Render(Actor self, WorldRenderer wr) public IEnumerable<IRenderable> Render(Actor self, WorldRenderer wr)
{ {
return !info.SelectionDecoration ? RenderInner(self, wr, self.Bounds) : Enumerable.Empty<IRenderable>(); return !Info.RequiresSelection ? RenderInner(self, wr) : Enumerable.Empty<IRenderable>();
} }
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr) public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr)
{ {
return info.SelectionDecoration ? RenderInner(self, wr, self.VisualBounds) : Enumerable.Empty<IRenderable>(); return Info.RequiresSelection ? RenderInner(self, wr) : Enumerable.Empty<IRenderable>();
} }
IEnumerable<IRenderable> RenderInner(Actor self, WorldRenderer wr, Rectangle actorBounds) IEnumerable<IRenderable> RenderInner(Actor self, WorldRenderer wr)
{ {
if (IsTraitDisabled) if (IsTraitDisabled || self.IsDead || !self.IsInWorld || Anim == null)
return Enumerable.Empty<IRenderable>(); return Enumerable.Empty<IRenderable>();
if (self.IsDead || !self.IsInWorld) if (self.World.RenderPlayer != null)
return Enumerable.Empty<IRenderable>();
if (anim == null)
return Enumerable.Empty<IRenderable>();
var allied = self.Owner.IsAlliedWith(self.World.RenderPlayer);
if (!allied && !info.ShowToEnemies)
return Enumerable.Empty<IRenderable>();
if (allied && !info.ShowToAllies)
return Enumerable.Empty<IRenderable>();
if (!ShouldRender(self))
return Enumerable.Empty<IRenderable>();
if (self.World.FogObscures(self))
return Enumerable.Empty<IRenderable>();
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)
{ {
case ReferencePoints.Top: var stance = self.Owner.Stances[self.World.RenderPlayer];
pxPos = pxPos.WithY(actorBounds.Top + imgSize.Y / 2); if (!Info.Stances.HasStance(stance))
break; return Enumerable.Empty<IRenderable>();
case ReferencePoints.VCenter:
pxPos = pxPos.WithY((actorBounds.Top + actorBounds.Bottom) / 2);
break;
case ReferencePoints.Bottom:
pxPos = pxPos.WithY(actorBounds.Bottom - imgSize.Y / 2);
break;
} }
switch (info.ReferencePoint & (ReferencePoints)(3 << 2)) if (!ShouldRender(self) || self.World.FogObscures(self))
return Enumerable.Empty<IRenderable>();
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: boundsOffset -= new int2(0, bounds.Height / 2);
pxPos = pxPos.WithX(actorBounds.Left + imgSize.X / 2); sizeOffset += new int2(0, halfSize.Y);
break; }
case ReferencePoints.HCenter: else if (Info.ReferencePoint.HasFlag(ReferencePoints.Bottom))
pxPos = pxPos.WithX((actorBounds.Left + actorBounds.Right) / 2); {
break; boundsOffset += new int2(0, bounds.Height / 2);
case ReferencePoints.Right: sizeOffset -= new int2(0, halfSize.Y);
pxPos = pxPos.WithX(actorBounds.Right - imgSize.X / 2);
break;
} }
pxPos += info.Offset; if (Info.ReferencePoint.HasFlag(ReferencePoints.Left))
{
// HACK: Because WorldRenderer.Position() does not care about terrain height at the location boundsOffset -= new int2(bounds.Width / 2, 0);
var renderPos = wr.ProjectedPosition(pxPos); sizeOffset += new int2(halfSize.X, 0);
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) };
} }
else if (Info.ReferencePoint.HasFlag(ReferencePoints.Right))
{
boundsOffset += new int2(bounds.Width / 2, 0);
sizeOffset -= new int2(halfSize.X, 0);
}
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(); }
} }
} }

View File

@@ -21,7 +21,7 @@ namespace OpenRA.Mods.Common.Traits.Render
protected override void UpgradeLevelChanged(Actor self, int oldLevel, int newLevel) protected override void UpgradeLevelChanged(Actor self, int oldLevel, int newLevel)
{ {
PlaySingleFrame(newLevel - 1); Anim.PlayFetchIndex(Info.Sequence, () => newLevel - 1);
} }
} }
} }

View File

@@ -30,15 +30,9 @@ namespace OpenRA.Mods.Common.Traits
[PaletteReference] public readonly string Palette = "chrome"; [PaletteReference] public readonly string Palette = "chrome";
[Desc("Point on the production icon's used as reference for offsetting the overlay. ", [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; 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); } 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() bool IProductionIconOverlay.IsOverlayActive(ActorInfo ai)
{
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 isActive; bool isActive;
overlayActive.TryGetValue(ai, out isActive); if (!overlayActive.TryGetValue(ai, out isActive))
return false;
return isActive; return isActive;
} }

View File

@@ -77,9 +77,8 @@ namespace OpenRA.Mods.Common.Traits
public interface IProductionIconOverlay public interface IProductionIconOverlay
{ {
Sprite Sprite(); Sprite Sprite { get; }
string Palette(); string Palette { get; }
float Scale();
float2 Offset(float2 iconSize); float2 Offset(float2 iconSize);
bool IsOverlayActive(ActorInfo ai); bool IsOverlayActive(ActorInfo ai);
} }

View File

@@ -14,6 +14,7 @@ using System.Drawing;
using System.Globalization; using System.Globalization;
using System.Linq; using System.Linq;
using OpenRA.Graphics; using OpenRA.Graphics;
using OpenRA.Traits;
namespace OpenRA.Mods.Common.UtilityCommands namespace OpenRA.Mods.Common.UtilityCommands
{ {
@@ -2702,6 +2703,67 @@ namespace OpenRA.Mods.Common.UtilityCommands
node.Value.Nodes.Add(new MiniYamlNode("ParticleSize", "1, 1")); 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<string[]>("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<bool>("ShowToAllies", showToAllies.Value.Value))
stance ^= Stance.Ally;
var showToEnemies = node.Value.Nodes.FirstOrDefault(n => n.Key == "ShowToEnemies");
if (showToEnemies != null && FieldLoader.GetValue<bool>("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<MiniYamlNode>();
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); UpgradeActorRules(engineVersion, ref node.Value.Nodes, node, depth + 1);
} }
} }

View File

@@ -91,10 +91,11 @@ namespace OpenRA.Mods.Common.Widgets
var location = new float2(RenderBounds.Location) + new float2(queue.i * (IconWidth + IconSpacing), 0); 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); WidgetUtils.DrawSHPCentered(icon.Image, location + 0.5f * iconSize, worldRenderer.Palette(bi.IconPalette), 0.5f);
var pio = queue.Trait.Actor.Owner.PlayerActor.TraitsImplementing<IProductionIconOverlay>().FirstOrDefault(); var pio = queue.Trait.Actor.Owner.PlayerActor.TraitsImplementing<IProductionIconOverlay>()
if (pio != null && pio.IsOverlayActive(actor)) .FirstOrDefault(p => p.IsOverlayActive(actor));
WidgetUtils.DrawSHPCentered(pio.Sprite(), location + 0.5f * iconSize + pio.Offset(0.5f * iconSize), if (pio != null)
worldRenderer.Palette(pio.Palette()), 0.5f * pio.Scale()); WidgetUtils.DrawSHPCentered(pio.Sprite, location + 0.5f * iconSize + pio.Offset(0.5f * iconSize),
worldRenderer.Palette(pio.Palette), 0.5f);
var clock = clocks[queue.Trait]; var clock = clocks[queue.Trait];
clock.PlayFetchIndex(ClockSequence, clock.PlayFetchIndex(ClockSequence,

View File

@@ -374,8 +374,7 @@ namespace OpenRA.Mods.Common.Widgets
var buildableItems = CurrentQueue.BuildableItems(); var buildableItems = CurrentQueue.BuildableItems();
var pio = currentQueue.Actor.Owner.PlayerActor.TraitsImplementing<IProductionIconOverlay>().FirstOrDefault(); var pios = currentQueue.Actor.Owner.PlayerActor.TraitsImplementing<IProductionIconOverlay>();
var pioOffset = pio != null ? pio.Offset(IconSize) : new float2(0, 0);
// Icons // Icons
foreach (var icon in icons.Values) foreach (var icon in icons.Values)
@@ -383,8 +382,9 @@ namespace OpenRA.Mods.Common.Widgets
WidgetUtils.DrawSHPCentered(icon.Sprite, icon.Pos + iconOffset, icon.Palette); WidgetUtils.DrawSHPCentered(icon.Sprite, icon.Pos + iconOffset, icon.Palette);
// Draw the ProductionIconOverlay's sprite // Draw the ProductionIconOverlay's sprite
if (pio != null && pio.IsOverlayActive(icon.Actor)) var pio = pios.FirstOrDefault(p => p.IsOverlayActive(icon.Actor));
WidgetUtils.DrawSHPCentered(pio.Sprite(), icon.Pos + iconOffset + pioOffset, worldRenderer.Palette(pio.Palette()), pio.Scale()); if (pio != null)
WidgetUtils.DrawSHPCentered(pio.Sprite, icon.Pos + iconOffset + pio.Offset(IconSize), worldRenderer.Palette(pio.Palette), 1f);
// Build progress // Build progress
if (icon.Queued.Count > 0) if (icon.Queued.Count > 0)

View File

@@ -86,7 +86,6 @@
<Compile Include="Scripting\Properties\InfiltrateProperties.cs" /> <Compile Include="Scripting\Properties\InfiltrateProperties.cs" />
<Compile Include="Scripting\Properties\DisguiseProperties.cs" /> <Compile Include="Scripting\Properties\DisguiseProperties.cs" />
<Compile Include="Traits\Attack\AttackLeap.cs" /> <Compile Include="Traits\Attack\AttackLeap.cs" />
<Compile Include="Traits\Buildings\Fake.cs" />
<Compile Include="Traits\Buildings\ClonesProducedUnits.cs" /> <Compile Include="Traits\Buildings\ClonesProducedUnits.cs" />
<Compile Include="Traits\Chronoshiftable.cs" /> <Compile Include="Traits\Chronoshiftable.cs" />
<Compile Include="Traits\Cloneable.cs" /> <Compile Include="Traits\Cloneable.cs" />

View File

@@ -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<Fake> { }
class Fake : ITags
{
public IEnumerable<TagType> GetTags() { yield return TagType.Fake; }
}
}

View File

@@ -48,7 +48,6 @@
Sequence: rank Sequence: rank
Palette: effect Palette: effect
ReferencePoint: Bottom, Right ReferencePoint: Bottom, Right
Offset: 2, 2
UpgradeTypes: rank UpgradeTypes: rank
ZOffset: 256 ZOffset: 256
UpgradeMinEnabledLevel: 1 UpgradeMinEnabledLevel: 1

View File

@@ -48,7 +48,6 @@
Sequence: rank Sequence: rank
Palette: effect Palette: effect
ReferencePoint: Bottom, Right ReferencePoint: Bottom, Right
Offset: 2, 2
UpgradeTypes: rank UpgradeTypes: rank
ZOffset: 256 ZOffset: 256
UpgradeMinEnabledLevel: 1 UpgradeMinEnabledLevel: 1

View File

@@ -88,13 +88,21 @@ construction_yard:
Prerequisites: upgrade.conyard Prerequisites: upgrade.conyard
Upgrades: stardecoration Upgrades: stardecoration
WithDecoration@upgraded: WithDecoration@upgraded:
SelectionDecoration: true RequiresSelection: true
Image: pips Image: pips
Sequence: tag-upgraded Sequence: tag-upgraded
ReferencePoint: Top, Right ReferencePoint: Top, Right
ZOffset: 256 ZOffset: 256
UpgradeTypes: stardecoration UpgradeTypes: stardecoration
UpgradeMinEnabledLevel: 1 UpgradeMinEnabledLevel: 1
WithDecoration@primary:
RequiresSelection: true
Image: pips
Sequence: tag-primary
ReferencePoint: Top
ZOffset: 256
UpgradeTypes: primary
UpgradeMinEnabledLevel: 1
wind_trap: wind_trap:
Inherits: ^Building Inherits: ^Building
@@ -191,13 +199,21 @@ barracks:
Prerequisites: upgrade.barracks Prerequisites: upgrade.barracks
Upgrades: stardecoration Upgrades: stardecoration
WithDecoration@upgraded: WithDecoration@upgraded:
SelectionDecoration: true RequiresSelection: true
Image: pips Image: pips
Sequence: tag-upgraded Sequence: tag-upgraded
ReferencePoint: Top, Right ReferencePoint: Top, Right
ZOffset: 256 ZOffset: 256
UpgradeTypes: stardecoration UpgradeTypes: stardecoration
UpgradeMinEnabledLevel: 1 UpgradeMinEnabledLevel: 1
WithDecoration@primary:
RequiresSelection: true
Image: pips
Sequence: tag-primary
ReferencePoint: Top
ZOffset: 256
UpgradeTypes: primary
UpgradeMinEnabledLevel: 1
refinery: refinery:
Inherits: ^Building Inherits: ^Building
@@ -359,13 +375,21 @@ light_factory:
Prerequisites: upgrade.light Prerequisites: upgrade.light
Upgrades: stardecoration Upgrades: stardecoration
WithDecoration@upgraded: WithDecoration@upgraded:
SelectionDecoration: true RequiresSelection: true
Image: pips Image: pips
Sequence: tag-upgraded Sequence: tag-upgraded
ReferencePoint: Top, Right ReferencePoint: Top, Right
ZOffset: 256 ZOffset: 256
UpgradeTypes: stardecoration UpgradeTypes: stardecoration
UpgradeMinEnabledLevel: 1 UpgradeMinEnabledLevel: 1
WithDecoration@primary:
RequiresSelection: true
Image: pips
Sequence: tag-primary
ReferencePoint: Top
ZOffset: 256
UpgradeTypes: primary
UpgradeMinEnabledLevel: 1
heavy_factory: heavy_factory:
Inherits: ^Building Inherits: ^Building
@@ -432,13 +456,21 @@ heavy_factory:
Prerequisites: upgrade.heavy Prerequisites: upgrade.heavy
Upgrades: stardecoration Upgrades: stardecoration
WithDecoration@upgraded: WithDecoration@upgraded:
SelectionDecoration: true RequiresSelection: true
Image: pips Image: pips
Sequence: tag-upgraded Sequence: tag-upgraded
ReferencePoint: Top, Right ReferencePoint: Top, Right
ZOffset: 256 ZOffset: 256
UpgradeTypes: stardecoration UpgradeTypes: stardecoration
UpgradeMinEnabledLevel: 1 UpgradeMinEnabledLevel: 1
WithDecoration@primary:
RequiresSelection: true
Image: pips
Sequence: tag-primary
ReferencePoint: Top
ZOffset: 256
UpgradeTypes: primary
UpgradeMinEnabledLevel: 1
outpost: outpost:
Inherits: ^Building Inherits: ^Building
@@ -541,6 +573,14 @@ starport:
Power: Power:
Amount: -150 Amount: -150
ProvidesPrerequisite@buildingname: ProvidesPrerequisite@buildingname:
WithDecoration@primary:
RequiresSelection: true
Image: pips
Sequence: tag-primary
ReferencePoint: Top
ZOffset: 256
UpgradeTypes: primary
UpgradeMinEnabledLevel: 1
wall: wall:
Inherits@1: ^SpriteActor Inherits@1: ^SpriteActor
@@ -782,7 +822,7 @@ high_tech_factory:
Prerequisites: upgrade.hightech Prerequisites: upgrade.hightech
Upgrades: stardecoration Upgrades: stardecoration
WithDecoration@upgraded: WithDecoration@upgraded:
SelectionDecoration: true RequiresSelection: true
Image: pips Image: pips
Sequence: tag-upgraded Sequence: tag-upgraded
ReferencePoint: Top, Right ReferencePoint: Top, Right

View File

@@ -107,6 +107,7 @@ pips:
pickup-indicator: DATA.R8 pickup-indicator: DATA.R8
Start: 112 Start: 112
tag-primary: primary.shp tag-primary: primary.shp
Offset: 0, 2
pip-empty: DATA.R8 pip-empty: DATA.R8
Start: 15 Start: 15
pip-green: DATA.R8 pip-green: DATA.R8

View File

@@ -47,7 +47,6 @@
Sequence: rank Sequence: rank
Palette: effect Palette: effect
ReferencePoint: Bottom, Right ReferencePoint: Bottom, Right
Offset: 2, 2
UpgradeTypes: rank UpgradeTypes: rank
ZOffset: 256 ZOffset: 256
UpgradeMinEnabledLevel: 1 UpgradeMinEnabledLevel: 1
@@ -521,7 +520,12 @@
DamageThreshold: 90 DamageThreshold: 90
RevealsShroud: RevealsShroud:
Range: 4c0 Range: 4c0
Fake: WithDecoration@fake:
RequiresSelection: true
Image: pips
Sequence: tag-fake
ReferencePoint: Top
ZOffset: 256
-EmitInfantryOnSell: -EmitInfantryOnSell:
-MustBeDestroyed: -MustBeDestroyed:

View File

@@ -218,7 +218,6 @@ SPY:
Sequence: pip-disguise Sequence: pip-disguise
Palette: effect Palette: effect
ReferencePoint: Top, Right ReferencePoint: Top, Right
Offset: 4, -2
ZOffset: 256 ZOffset: 256
UpgradeTypes: disguise UpgradeTypes: disguise
UpgradeMinEnabledLevel: 1 UpgradeMinEnabledLevel: 1

View File

@@ -66,7 +66,6 @@ Player:
GlobalUpgradeManager: GlobalUpgradeManager:
EnemyWatcher: EnemyWatcher:
VeteranProductionIconOverlay: VeteranProductionIconOverlay:
Offset: 2, 2
Image: iconchevrons Image: iconchevrons
Sequence: veteran Sequence: veteran

View File

@@ -169,6 +169,14 @@ SPEN:
ProvidesPrerequisite@buildingname: ProvidesPrerequisite@buildingname:
EditorTilesetFilter: EditorTilesetFilter:
ExcludeTilesets: INTERIOR ExcludeTilesets: INTERIOR
WithDecoration@primary:
RequiresSelection: true
Image: pips
Sequence: tag-primary
ReferencePoint: Top
ZOffset: 256
UpgradeTypes: primary
UpgradeMinEnabledLevel: 1
SYRD: SYRD:
Inherits: ^Building Inherits: ^Building
@@ -256,6 +264,14 @@ SYRD:
ProvidesPrerequisite@buildingname: ProvidesPrerequisite@buildingname:
EditorTilesetFilter: EditorTilesetFilter:
ExcludeTilesets: INTERIOR ExcludeTilesets: INTERIOR
WithDecoration@primary:
RequiresSelection: true
Image: pips
Sequence: tag-primary
ReferencePoint: Top
ZOffset: 256
UpgradeTypes: primary
UpgradeMinEnabledLevel: 1
IRON: IRON:
Inherits: ^ScienceBuilding Inherits: ^ScienceBuilding
@@ -845,6 +861,14 @@ WEAP:
TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate
InfiltrateForSupportPower: InfiltrateForSupportPower:
Proxy: vehicles.upgraded Proxy: vehicles.upgraded
WithDecoration@primary:
RequiresSelection: true
Image: pips
Sequence: tag-primary
ReferencePoint: Top
ZOffset: 256
UpgradeTypes: primary
UpgradeMinEnabledLevel: 1
FACT: FACT:
Inherits: ^Building Inherits: ^Building
@@ -1074,6 +1098,14 @@ HPAD:
TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate
InfiltrateForSupportPower: InfiltrateForSupportPower:
Proxy: aircraft.upgraded Proxy: aircraft.upgraded
WithDecoration@primary:
RequiresSelection: true
Image: pips
Sequence: tag-primary
ReferencePoint: Top
ZOffset: 256
UpgradeTypes: primary
UpgradeMinEnabledLevel: 1
AFLD: AFLD:
Inherits: ^Building Inherits: ^Building
@@ -1183,6 +1215,14 @@ AFLD:
TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate
InfiltrateForSupportPower: InfiltrateForSupportPower:
Proxy: aircraft.upgraded Proxy: aircraft.upgraded
WithDecoration@primary:
RequiresSelection: true
Image: pips
Sequence: tag-primary
ReferencePoint: Top
ZOffset: 256
UpgradeTypes: primary
UpgradeMinEnabledLevel: 1
POWR: POWR:
Inherits: ^Building Inherits: ^Building
@@ -1354,6 +1394,14 @@ BARR:
Proxy: barracks.upgraded Proxy: barracks.upgraded
Targetable: Targetable:
TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate
WithDecoration@primary:
RequiresSelection: true
Image: pips
Sequence: tag-primary
ReferencePoint: Top
ZOffset: 256
UpgradeTypes: primary
UpgradeMinEnabledLevel: 1
KENN: KENN:
Inherits: ^Building Inherits: ^Building
@@ -1394,6 +1442,14 @@ KENN:
ProvidesPrerequisite@buildingname: ProvidesPrerequisite@buildingname:
WithBuildingExplosion: WithBuildingExplosion:
Sequences: building, building_napalm, large_explosion, self_destruct 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: TENT:
Inherits: ^Building Inherits: ^Building
@@ -1466,6 +1522,14 @@ TENT:
Proxy: barracks.upgraded Proxy: barracks.upgraded
Targetable: Targetable:
TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate
WithDecoration@primary:
RequiresSelection: true
Image: pips
Sequence: tag-primary
ReferencePoint: Top
ZOffset: 256
UpgradeTypes: primary
UpgradeMinEnabledLevel: 1
FIX: FIX:
Inherits: ^Building Inherits: ^Building

View File

@@ -57,8 +57,10 @@ pips:
# Start: 4 # Start: 4
tag-fake: tag-fake:
Start: 18 Start: 18
Offset: 0, 2
tag-primary: tag-primary:
Start: 2 Start: 2
Offset: 0, 2
pip-empty: pips2 pip-empty: pips2
pip-green: pips2 pip-green: pips2
Start: 1 Start: 1
@@ -73,6 +75,7 @@ pips:
pip-disguise: pip-disguise pip-disguise: pip-disguise
Length: * Length: *
Tick: 300 Tick: 300
Offset: 0, -6
v2: v2:
idle: idle:
@@ -370,6 +373,7 @@ rank:
iconchevrons: iconchevrons:
veteran: veteran:
Offset: 2, 2
atomic: atomic:
up: atomicup up: atomicup

View File

@@ -65,7 +65,6 @@ CHAMSPY:
Sequence: pip-disguise Sequence: pip-disguise
Palette: pips Palette: pips
ReferencePoint: Top, Right ReferencePoint: Top, Right
Offset: 4, -2
ZOffset: 256 ZOffset: 256
UpgradeTypes: disguise UpgradeTypes: disguise
UpgradeMinEnabledLevel: 1 UpgradeMinEnabledLevel: 1

View File

@@ -44,7 +44,6 @@
Sequence: rank Sequence: rank
Palette: ra Palette: ra
ReferencePoint: Bottom, Right ReferencePoint: Bottom, Right
Offset: 2, 2
UpgradeTypes: rank UpgradeTypes: rank
ZOffset: 256 ZOffset: 256
UpgradeMinEnabledLevel: 1 UpgradeMinEnabledLevel: 1
@@ -61,10 +60,8 @@
TimedUpgradeBar@EMPDISABLE: TimedUpgradeBar@EMPDISABLE:
Upgrade: empdisable Upgrade: empdisable
Color: FFFFFF Color: FFFFFF
WithDecoration@EMPDISABLE: WithIdleOverlay@EMPDISABLE:
Image: emp Sequence: emp-overlay
Sequence: idle
ReferencePoint: HCenter, VCenter
Palette: effect Palette: effect
UpgradeTypes: empdisable UpgradeTypes: empdisable
ShowToEnemies: true ShowToEnemies: true
@@ -456,7 +453,6 @@
^CivilianVoxelVehicle: ^CivilianVoxelVehicle:
Inherits: ^VoxelVehicle Inherits: ^VoxelVehicle
-RenderSprites:
-MustBeDestroyed: -MustBeDestroyed:
^Aircraft: ^Aircraft:
@@ -666,6 +662,7 @@
Inherits@1: ^EmpDisableMobile Inherits@1: ^EmpDisableMobile
Inherits@2: ^ExistsInWorld Inherits@2: ^ExistsInWorld
RenderVoxels: RenderVoxels:
RenderSprites:
WithVoxelBody: WithVoxelBody:
DrawLineToTarget: DrawLineToTarget:
Mobile: Mobile:

View File

@@ -108,6 +108,15 @@ GAPILE:
ProvidesPrerequisite@buildingname: ProvidesPrerequisite@buildingname:
SelectionDecorations: SelectionDecorations:
VisualBounds: 88, 56, 0, -8 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: GAWEAP:
Inherits: ^Building Inherits: ^Building
@@ -159,6 +168,15 @@ GAWEAP:
ProvidesPrerequisite@buildingname: ProvidesPrerequisite@buildingname:
SelectionDecorations: SelectionDecorations:
VisualBounds: 154, 100, -2, -12 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: GAHPAD:
Inherits: ^Building Inherits: ^Building
@@ -203,6 +221,15 @@ GAHPAD:
ProvidesPrerequisite@buildingname: ProvidesPrerequisite@buildingname:
SelectionDecorations: SelectionDecorations:
VisualBounds: 88, 66, 0, -5 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: GADEPT:
Inherits: ^Building Inherits: ^Building

View File

@@ -116,6 +116,15 @@ NAHAND:
ProvidesPrerequisite@buildingname: ProvidesPrerequisite@buildingname:
SelectionDecorations: SelectionDecorations:
VisualBounds: 116, 78, 3, -8 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: NAWEAP:
Inherits: ^Building Inherits: ^Building
@@ -163,6 +172,15 @@ NAWEAP:
ProvidesPrerequisite@buildingname: ProvidesPrerequisite@buildingname:
SelectionDecorations: SelectionDecorations:
VisualBounds: 149, 116, -3, -20 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: NAHPAD:
Inherits: ^Building Inherits: ^Building
@@ -207,6 +225,15 @@ NAHPAD:
ProvidesPrerequisite@buildingname: ProvidesPrerequisite@buildingname:
SelectionDecorations: SelectionDecorations:
VisualBounds: 78, 54, 0, -8 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: NARADR:
Inherits: ^Building Inherits: ^Building
@@ -406,3 +433,4 @@ NAWAST:
SelectionDecorations: SelectionDecorations:
VisualBounds: 100, 60, 5, -5 VisualBounds: 100, 60, 5, -5
RenderSprites: RenderSprites:

View File

@@ -919,6 +919,12 @@ gaspot:
make: gaspotmk make: gaspotmk
Length: 14 Length: 14
ShadowStart: 14 ShadowStart: 14
emp-overlay: emp_fx01
Length: *
Offset: 0, 0
UseTilesetCode: false
ZOffset: 512
BlendMode: Additive
icon: spoticon icon: spoticon
Offset: 0, 0 Offset: 0, 0
UseTilesetCode: false UseTilesetCode: false
@@ -935,6 +941,12 @@ galite:
lighting: alphatst lighting: alphatst
BlendMode: DoubleMultiplicative BlendMode: DoubleMultiplicative
UseTilesetCode: false UseTilesetCode: false
emp-overlay: emp_fx01
Length: *
Offset: 0, 0
UseTilesetCode: false
ZOffset: 512
BlendMode: Additive
icon: liteicon icon: liteicon
Offset: 0, 0 Offset: 0, 0
UseTilesetCode: false UseTilesetCode: false

View File

@@ -953,6 +953,10 @@ cyc2:
ShadowStart: 190 ShadowStart: 190
die6: electro die6: electro
Length: * Length: *
emp-overlay: emp_fx01
Length: *
ZOffset: 512
BlendMode: Additive
icon: cybcicon icon: cybcicon
cyborg: cyborg:
@@ -1014,6 +1018,10 @@ cyborg:
ShadowStart: 662 ShadowStart: 662
die6: electro die6: electro
Length: * Length: *
emp-overlay: emp_fx01
Length: *
ZOffset: 512
BlendMode: Additive
icon: cybiicon icon: cybiicon
mutant: mutant:

View File

@@ -90,6 +90,7 @@ pips:
Length: 10 Length: 10
tag-primary: pipsra #TODO: backfall to RA asset tag-primary: pipsra #TODO: backfall to RA asset
Start: 2 Start: 2
Offset: 0, 2
pip-empty: pips2 pip-empty: pips2
pip-green: pips2 pip-green: pips2
Start: 1 Start: 1
@@ -107,6 +108,8 @@ pips:
pip-disguise: pip-disguise pip-disguise: pip-disguise
Length: * Length: *
Tick: 300 Tick: 300
Offset: 0, -6
# TODO: # TODO:
pip-empty-building: pip-empty-building:
pip-green-building: pip-green-building:
@@ -244,11 +247,6 @@ wake:
Length: * Length: *
Tick: 180 Tick: 180
emp:
idle: emp_fx01
Length: *
BlendMode: Additive
resources: resources:
Defaults: Defaults:
UseTilesetExtension: true UseTilesetExtension: true

View File

@@ -40,6 +40,12 @@ gacnst:
Length: 10 Length: 10
damaged-idle-front: gtcnst_b damaged-idle-front: gtcnst_b
Length: 10 Length: 10
emp-overlay: emp_fx01
Length: *
Offset: 0, 0
UseTilesetCode: false
ZOffset: 512
BlendMode: Additive
icon: facticon icon: facticon
Offset: 0,0 Offset: 0,0
UseTilesetCode: false UseTilesetCode: false
@@ -89,6 +95,12 @@ gapowr:
make: gtpowrmk make: gtpowrmk
Length: 20 Length: 20
ShadowStart: 20 ShadowStart: 20
emp-overlay: emp_fx01
Length: *
Offset: 0, 0
UseTilesetCode: false
ZOffset: 512
BlendMode: Additive
icon: powricon icon: powricon
Offset: 0, 0 Offset: 0, 0
UseTilesetCode: false UseTilesetCode: false
@@ -133,6 +145,12 @@ gapile:
make: gtpilemk make: gtpilemk
Length: 20 Length: 20
ShadowStart: 20 ShadowStart: 20
emp-overlay: emp_fx01
Length: *
Offset: 0, 0
UseTilesetCode: false
ZOffset: 512
BlendMode: Additive
icon: brrkicon icon: brrkicon
Offset: 0, 0 Offset: 0, 0
UseTilesetCode: false UseTilesetCode: false
@@ -204,6 +222,12 @@ gaweap:
Start: 2 Start: 2
Length: 1 Length: 1
ZOffset: -1024 ZOffset: -1024
emp-overlay: emp_fx01
Length: *
Offset: 0, 0
UseTilesetCode: false
ZOffset: 512
BlendMode: Additive
icon: weapicon icon: weapicon
Offset: 0, 0 Offset: 0, 0
UseTilesetCode: false UseTilesetCode: false
@@ -231,6 +255,12 @@ napowr:
make: ntpowrmk make: ntpowrmk
Length: 19 Length: 19
ShadowStart: 19 ShadowStart: 19
emp-overlay: emp_fx01
Length: *
Offset: 0, 0
UseTilesetCode: false
ZOffset: 512
BlendMode: Additive
icon: npwricon icon: npwricon
Offset: 0, 0 Offset: 0, 0
UseTilesetCode: false UseTilesetCode: false
@@ -258,6 +288,12 @@ naapwr:
make: ntapwrmk make: ntapwrmk
Length: 19 Length: 19
ShadowStart: 19 ShadowStart: 19
emp-overlay: emp_fx01
Length: *
Offset: 0, 0
UseTilesetCode: false
ZOffset: 512
BlendMode: Additive
icon: apwricon icon: apwricon
Offset: 0, 0 Offset: 0, 0
UseTilesetCode: false UseTilesetCode: false
@@ -294,6 +330,12 @@ nahand:
make: nthandmk make: nthandmk
Length: 15 Length: 15
ShadowStart: 15 ShadowStart: 15
emp-overlay: emp_fx01
Length: *
Offset: 0, 0
UseTilesetCode: false
ZOffset: 512
BlendMode: Additive
icon: handicon icon: handicon
Offset: 0, 0 Offset: 0, 0
UseTilesetCode: false UseTilesetCode: false
@@ -350,6 +392,12 @@ naweap:
dead-bib: ntweapbb dead-bib: ntweapbb
Start: 2 Start: 2
ZOffset: -1024 ZOffset: -1024
emp-overlay: emp_fx01
Length: *
Offset: 0, 0
UseTilesetCode: false
ZOffset: 512
BlendMode: Additive
icon: nwepicon icon: nwepicon
Offset: 0, 0 Offset: 0, 0
UseTilesetCode: false UseTilesetCode: false
@@ -377,6 +425,12 @@ naradr:
make: ntradrmk make: ntradrmk
Length: 20 Length: 20
ShadowStart: 20 ShadowStart: 20
emp-overlay: emp_fx01
Length: *
Offset: 0, 0
UseTilesetCode: false
ZOffset: 512
BlendMode: Additive
icon: nradicon icon: nradicon
Offset: 0, 0 Offset: 0, 0
UseTilesetCode: false UseTilesetCode: false
@@ -403,6 +457,12 @@ natech:
make: nttechmk make: nttechmk
Length: 18 Length: 18
ShadowStart: 18 ShadowStart: 18
emp-overlay: emp_fx01
Length: *
Offset: 0, 0
UseTilesetCode: false
ZOffset: 512
BlendMode: Additive
icon: ntchicon icon: ntchicon
Offset: 0, 0 Offset: 0, 0
UseTilesetCode: false UseTilesetCode: false
@@ -430,6 +490,12 @@ natmpl:
make: nttmplmk make: nttmplmk
Length: 17 Length: 17
ShadowStart: 17 ShadowStart: 17
emp-overlay: emp_fx01
Length: *
Offset: 0, 0
UseTilesetCode: false
ZOffset: 512
BlendMode: Additive
icon: tmplicon icon: tmplicon
Offset: 0, 0 Offset: 0, 0
UseTilesetCode: false UseTilesetCode: false
@@ -459,6 +525,12 @@ garadr:
make: gtradrmk make: gtradrmk
Length: 20 Length: 20
ShadowStart: 20 ShadowStart: 20
emp-overlay: emp_fx01
Length: *
Offset: 0, 0
UseTilesetCode: false
ZOffset: 512
BlendMode: Additive
icon: radricon icon: radricon
Offset: 0, 0 Offset: 0, 0
UseTilesetCode: false UseTilesetCode: false
@@ -486,6 +558,12 @@ gatech:
make: gttechmk make: gttechmk
Length: 20 Length: 20
ShadowStart: 20 ShadowStart: 20
emp-overlay: emp_fx01
Length: *
Offset: 0, 0
UseTilesetCode: false
ZOffset: 512
BlendMode: Additive
icon: techicon icon: techicon
Offset: 0, 0 Offset: 0, 0
UseTilesetCode: false UseTilesetCode: false
@@ -556,6 +634,12 @@ gatick:
Length: * Length: *
Offset: 0, 0 Offset: 0, 0
UseTilesetCode: false UseTilesetCode: false
emp-overlay: emp_fx01
Length: *
Offset: 0, 0
UseTilesetCode: false
ZOffset: 512
BlendMode: Additive
make: gatickmk make: gatickmk
Length: 24 Length: 24
ShadowStart: 24 ShadowStart: 24
@@ -569,6 +653,12 @@ gaicbm:
damaged-idle: damaged-idle:
Start: 1 Start: 1
ShadowStart: 4 ShadowStart: 4
emp-overlay: emp_fx01
Length: *
Offset: 0, 0
UseTilesetCode: false
ZOffset: 512
BlendMode: Additive
make: gaicbmmk make: gaicbmmk
Length: 30 Length: 30
ShadowStart: 30 ShadowStart: 30
@@ -586,6 +676,12 @@ gaarty:
Length: * Length: *
Offset: 0, 0 Offset: 0, 0
UseTilesetCode: false UseTilesetCode: false
emp-overlay: emp_fx01
Length: *
Offset: 0, 0
UseTilesetCode: false
ZOffset: 512
BlendMode: Additive
make: gaartymk make: gaartymk
Length: 16 Length: 16
ShadowStart: 16 ShadowStart: 16
@@ -613,6 +709,12 @@ naobel:
make: ntobelmk make: ntobelmk
Length: 19 Length: 19
ShadowStart: 19 ShadowStart: 19
emp-overlay: emp_fx01
Length: *
Offset: 0, 0
UseTilesetCode: false
ZOffset: 512
BlendMode: Additive
icon: obliicon icon: obliicon
Offset: 0, 0 Offset: 0, 0
UseTilesetCode: false UseTilesetCode: false
@@ -633,6 +735,12 @@ nalasr:
make: ntlasrmk make: ntlasrmk
Length: 21 Length: 21
ShadowStart: 21 ShadowStart: 21
emp-overlay: emp_fx01
Length: *
Offset: 0, 0
UseTilesetCode: false
ZOffset: 512
BlendMode: Additive
icon: plticon icon: plticon
Offset: 0, 0 Offset: 0, 0
UseTilesetCode: false UseTilesetCode: false
@@ -656,6 +764,12 @@ nasam:
make: ntsammk make: ntsammk
Length: 8 Length: 8
ShadowStart: 8 ShadowStart: 8
emp-overlay: emp_fx01
Length: *
Offset: 0, 0
UseTilesetCode: false
ZOffset: 512
BlendMode: Additive
icon: samicon icon: samicon
Offset: 0, 0 Offset: 0, 0
UseTilesetCode: false UseTilesetCode: false
@@ -678,6 +792,12 @@ napuls.gdi:
make: ntpulsmk make: ntpulsmk
Length: 20 Length: 20
ShadowStart: 20 ShadowStart: 20
emp-overlay: emp_fx01
Length: *
Offset: 0, 0
UseTilesetCode: false
ZOffset: 512
BlendMode: Additive
icon: sidec01.mix:empicon icon: sidec01.mix:empicon
Offset: 0, 0 Offset: 0, 0
UseTilesetCode: false UseTilesetCode: false
@@ -700,6 +820,12 @@ napuls.nod:
make: ntpulsmk make: ntpulsmk
Length: 20 Length: 20
ShadowStart: 20 ShadowStart: 20
emp-overlay: emp_fx01
Length: *
Offset: 0, 0
UseTilesetCode: false
ZOffset: 512
BlendMode: Additive
icon: sidec02.mix:empicon icon: sidec02.mix:empicon
Offset: 0, 0 Offset: 0, 0
UseTilesetCode: false UseTilesetCode: false
@@ -727,6 +853,12 @@ nastlh:
make: ntstlhmk make: ntstlhmk
Length: 18 Length: 18
ShadowStart: 20 ShadowStart: 20
emp-overlay: emp_fx01
Length: *
Offset: 0, 0
UseTilesetCode: false
ZOffset: 512
BlendMode: Additive
icon: clckicon icon: clckicon
Offset: 0, 0 Offset: 0, 0
UseTilesetCode: false UseTilesetCode: false
@@ -784,6 +916,12 @@ gactwr:
muzzle7: mgun-ne muzzle7: mgun-ne
Length: * Length: *
UseTilesetCode: false UseTilesetCode: false
emp-overlay: emp_fx01
Length: *
Offset: 0, 0
UseTilesetCode: false
ZOffset: 512
BlendMode: Additive
icon: towricon icon: towricon
Offset: 0, 0 Offset: 0, 0
UseTilesetCode: false UseTilesetCode: false
@@ -840,6 +978,12 @@ gahpad:
Length: 18 Length: 18
ShadowStart: 18 ShadowStart: 18
ZOffset: -1c511 ZOffset: -1c511
emp-overlay: emp_fx01
Length: *
Offset: 0, 0
UseTilesetCode: false
ZOffset: 512
BlendMode: Additive
icon: heliicon icon: heliicon
Offset: 0, 0 Offset: 0, 0
UseTilesetCode: false UseTilesetCode: false
@@ -884,6 +1028,12 @@ nahpad:
make: nthpadmk make: nthpadmk
Length: 20 Length: 20
ShadowStart: 20 ShadowStart: 20
emp-overlay: emp_fx01
Length: *
Offset: 0, 0
UseTilesetCode: false
ZOffset: 512
BlendMode: Additive
icon: nhpdicon icon: nhpdicon
Offset: 0, 0 Offset: 0, 0
UseTilesetCode: false UseTilesetCode: false
@@ -918,6 +1068,12 @@ proc.gdi:
damaged-bib: ntrefnbb damaged-bib: ntrefnbb
Start: 1 Start: 1
ZOffset: -1024 ZOffset: -1024
emp-overlay: emp_fx01
Length: *
Offset: 0, 0
UseTilesetCode: false
ZOffset: 512
BlendMode: Additive
icon: sidec01.mix:reficon icon: sidec01.mix:reficon
Offset: 0, 0 Offset: 0, 0
UseTilesetCode: false UseTilesetCode: false
@@ -952,6 +1108,12 @@ proc.nod:
damaged-bib: ntrefnbb damaged-bib: ntrefnbb
Start: 1 Start: 1
ZOffset: -1024 ZOffset: -1024
emp-overlay: emp_fx01
Length: *
Offset: 0, 0
UseTilesetCode: false
ZOffset: 512
BlendMode: Additive
icon: sidec02.mix:reficon icon: sidec02.mix:reficon
Offset: 0, 0 Offset: 0, 0
UseTilesetCode: false UseTilesetCode: false
@@ -993,6 +1155,12 @@ nawast:
damaged-bib: ntwastbb damaged-bib: ntwastbb
Start: 1 Start: 1
ZOffset: -1024 ZOffset: -1024
emp-overlay: emp_fx01
Length: *
Offset: 0, 0
UseTilesetCode: false
ZOffset: 512
BlendMode: Additive
icon: wasticon icon: wasticon
Offset: 0, 0 Offset: 0, 0
UseTilesetCode: false UseTilesetCode: false
@@ -1031,6 +1199,12 @@ gasilo.gdi:
make: gtsilomk make: gtsilomk
Length: 18 Length: 18
ShadowStart: 20 ShadowStart: 20
emp-overlay: emp_fx01
Length: *
Offset: 0, 0
UseTilesetCode: false
ZOffset: 512
BlendMode: Additive
icon: sidec01.mix:siloicon icon: sidec01.mix:siloicon
Offset: 0, 0 Offset: 0, 0
UseTilesetCode: false UseTilesetCode: false
@@ -1069,6 +1243,12 @@ gasilo.nod:
make: gtsilomk make: gtsilomk
Length: 18 Length: 18
ShadowStart: 20 ShadowStart: 20
emp-overlay: emp_fx01
Length: *
Offset: 0, 0
UseTilesetCode: false
ZOffset: 512
BlendMode: Additive
icon: sidec02.mix:siloicon icon: sidec02.mix:siloicon
Offset: 0, 0 Offset: 0, 0
UseTilesetCode: false UseTilesetCode: false
@@ -1127,6 +1307,12 @@ gadept.gdi:
Length: 10 Length: 10
Tick: 60 Tick: 60
ShadowStart: 10 ShadowStart: 10
emp-overlay: emp_fx01
Length: *
Offset: 0, 0
UseTilesetCode: false
ZOffset: 512
BlendMode: Additive
icon: sidec01.mix:fixicon icon: sidec01.mix:fixicon
Offset: 0, 0 Offset: 0, 0
UseTilesetCode: false UseTilesetCode: false
@@ -1185,6 +1371,12 @@ gadept.nod:
Length: 10 Length: 10
Tick: 60 Tick: 60
ShadowStart: 10 ShadowStart: 10
emp-overlay: emp_fx01
Length: *
Offset: 0, 0
UseTilesetCode: false
ZOffset: 512
BlendMode: Additive
icon: sidec02.mix:fixicon icon: sidec02.mix:fixicon
Offset: 76, 66 Offset: 76, 66
UseTilesetCode: false UseTilesetCode: false
@@ -1216,6 +1408,12 @@ namisl:
Start: 10 Start: 10
Length: 10 Length: 10
Tick: 80 Tick: 80
emp-overlay: emp_fx01
Length: *
Offset: 0, 0
UseTilesetCode: false
ZOffset: 512
BlendMode: Additive
icon: msslicon icon: msslicon
Offset: 0, 0 Offset: 0, 0
UseTilesetCode: false UseTilesetCode: false
@@ -1275,6 +1473,12 @@ gaplug:
make: gtplugmk make: gtplugmk
Length: 17 Length: 17
ShadowStart: 17 ShadowStart: 17
emp-overlay: emp_fx01
Length: *
Offset: 0, 0
UseTilesetCode: false
ZOffset: 512
BlendMode: Additive
icon: plugicon icon: plugicon
Offset: 0, 0 Offset: 0, 0
UseTilesetCode: false UseTilesetCode: false

View File

@@ -1,31 +1,51 @@
mcv.gdi: mcv.gdi:
emp-overlay: emp_fx01
Length: *
BlendMode: Additive
icon: sidec01.mix:mcvicon icon: sidec01.mix:mcvicon
mcv.nod: mcv.nod:
emp-overlay: emp_fx01
Length: *
BlendMode: Additive
icon: sidec02.mix:mcvicon icon: sidec02.mix:mcvicon
apc: apc:
emp-overlay: emp_fx01
Length: *
BlendMode: Additive
icon: apcicon icon: apcicon
harv.gdi: harv.gdi:
emp-overlay: emp_fx01
Length: *
BlendMode: Additive
harvest: harvestr harvest: harvestr
Length: * Length: *
icon: sidec01.mix:harvicon icon: sidec01.mix:harvicon
harv.nod: harv.nod:
emp-overlay: emp_fx01
Length: *
BlendMode: Additive
harvest: harvestr harvest: harvestr
Length: * Length: *
icon: sidec02.mix:harvicon icon: sidec02.mix:harvicon
hvr: hvr:
emp-overlay: emp_fx01
Length: *
BlendMode: Additive
icon: hovricon icon: hovricon
4tnk: 4tnk:
emp-overlay: emp_fx01
Length: *
BlendMode: Additive
muzzle: gunfire muzzle: gunfire
Length: * Length: *
lpst.gdi: lpst.gdi:
icon: sidec01.mix:lpsticon
idle: gadpsa idle: gadpsa
Offset: 0, -12 Offset: 0, -12
ShadowStart: 3 ShadowStart: 3
@@ -33,9 +53,12 @@ lpst.gdi:
Offset: 0, -12 Offset: 0, -12
Length: 36 Length: 36
ShadowStart: 36 ShadowStart: 36
emp-overlay: emp_fx01
Length: *
BlendMode: Additive
icon: sidec01.mix:lpsticon
lpst.nod: lpst.nod:
icon: sidec02.mix:lpsticon
idle: gadpsa idle: gadpsa
Offset: 0, -12 Offset: 0, -12
ShadowStart: 3 ShadowStart: 3
@@ -43,20 +66,39 @@ lpst.nod:
Offset: 0, -12 Offset: 0, -12
Length: 36 Length: 36
ShadowStart: 36 ShadowStart: 36
emp-overlay: emp_fx01
Length: *
BlendMode: Additive
icon: sidec02.mix:lpsticon
repair: repair:
emp-overlay: emp_fx01
Length: *
BlendMode: Additive
icon: rboticon icon: rboticon
art2: art2:
emp-overlay: emp_fx01
Length: *
BlendMode: Additive
icon: artyicon icon: artyicon
weed: weed:
emp-overlay: emp_fx01
Length: *
BlendMode: Additive
icon: weedicon icon: weedicon
hmec: hmec:
emp-overlay: emp_fx01
Length: *
BlendMode: Additive
icon: hmecicon icon: hmecicon
bike: bike:
emp-overlay: emp_fx01
Length: *
BlendMode: Additive
icon: cyclicon icon: cyclicon
bggy: bggy:
@@ -70,23 +112,40 @@ bggy:
muzzle5: mgun-se muzzle5: mgun-se
muzzle6: mgun-e muzzle6: mgun-e
muzzle7: mgun-ne muzzle7: mgun-ne
emp-overlay: emp_fx01
BlendMode: Additive
icon: bggyicon icon: bggyicon
sapc: sapc:
emp-overlay: emp_fx01
Length: *
BlendMode: Additive
icon: sapcicon icon: sapcicon
subtank: subtank:
emp-overlay: emp_fx01
Length: *
BlendMode: Additive
icon: subticon icon: subticon
sonic: sonic:
emp-overlay: emp_fx01
Length: *
BlendMode: Additive
icon: soniicon icon: soniicon
ttnk: ttnk:
muzzle: gunfire muzzle: gunfire
Length: * Length: *
emp-overlay: emp_fx01
Length: *
BlendMode: Additive
icon: tickicon icon: tickicon
stnk: stnk:
emp-overlay: emp_fx01
Length: *
BlendMode: Additive
icon: stnkicon icon: stnkicon
mmch: mmch:
@@ -103,6 +162,9 @@ mmch:
Facings: -32 Facings: -32
muzzle: gunfire muzzle: gunfire
Length: * Length: *
emp-overlay: emp_fx01
Length: *
BlendMode: Additive
icon: mmchicon icon: mmchicon
gghunt: gghunt:
@@ -110,6 +172,9 @@ gghunt:
Facings: 1 Facings: 1
Length: 8 Length: 8
ShadowStart: 8 ShadowStart: 8
emp-overlay: emp_fx01
Length: *
BlendMode: Additive
smech: smech:
stand: stand:
@@ -126,4 +191,67 @@ smech:
Facings: -8 Facings: -8
ShadowStart: 240 ShadowStart: 240
Tick: 100 Tick: 100
emp-overlay: emp_fx01
Length: *
BlendMode: Additive
icon: smchicon 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