Add SelectionDecoration flag to WithDecoration.

This commit is contained in:
Paul Chote
2015-11-24 22:44:54 +00:00
parent d626c7c568
commit ee1fb0f1e0

View File

@@ -10,6 +10,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing;
using System.Linq; using System.Linq;
using OpenRA.Graphics; using OpenRA.Graphics;
using OpenRA.Traits; using OpenRA.Traits;
@@ -59,19 +60,24 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Should this be visible to enemy players?")] [Desc("Should this be visible to enemy players?")]
public readonly bool ShowToEnemies = false; public readonly bool ShowToEnemies = false;
[Desc("Should this be visible only when selected?")]
public readonly bool SelectionDecoration = 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 public class WithDecoration : UpgradableTrait<WithDecorationInfo>, IRender, IPostRenderSelection
{ {
readonly WithDecorationInfo info; readonly WithDecorationInfo info;
readonly string image; readonly string image;
readonly Animation anim; readonly Animation anim;
readonly Actor self;
public WithDecoration(Actor self, WithDecorationInfo info) public WithDecoration(Actor self, WithDecorationInfo info)
: base(info) : base(info)
{ {
this.info = info; this.info = info;
this.self = self;
image = info.Image ?? self.Info.Name; image = info.Image ?? self.Info.Name;
anim = new Animation(self.World, image); anim = new Animation(self.World, image);
anim.Paused = () => self.World.Paused; anim.Paused = () => self.World.Paused;
@@ -86,6 +92,16 @@ namespace OpenRA.Mods.Common.Traits
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>();
}
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr)
{
return info.SelectionDecoration ? RenderInner(self, wr, self.VisualBounds) : Enumerable.Empty<IRenderable>();
}
IEnumerable<IRenderable> RenderInner(Actor self, WorldRenderer wr, Rectangle actorBounds)
{ {
if (IsTraitDisabled) if (IsTraitDisabled)
return Enumerable.Empty<IRenderable>(); return Enumerable.Empty<IRenderable>();
@@ -111,7 +127,6 @@ namespace OpenRA.Mods.Common.Traits
return Enumerable.Empty<IRenderable>(); return Enumerable.Empty<IRenderable>();
var pxPos = wr.ScreenPxPosition(self.CenterPosition); var pxPos = wr.ScreenPxPosition(self.CenterPosition);
var actorBounds = self.Bounds;
actorBounds.Offset(pxPos.X, pxPos.Y); actorBounds.Offset(pxPos.X, pxPos.Y);
var img = anim.Image; var img = anim.Image;