diff --git a/OpenRA.Mods.RA/Render/RenderSpy.cs b/OpenRA.Mods.RA/Render/RenderSpy.cs index 1cb78270a1..fc97095735 100755 --- a/OpenRA.Mods.RA/Render/RenderSpy.cs +++ b/OpenRA.Mods.RA/Render/RenderSpy.cs @@ -20,59 +20,33 @@ namespace OpenRA.Mods.RA.Render public override object Create(ActorInitializer init) { return new RenderSpy(init.self, this); } } - class RenderSpy : RenderInfantryProne, IRenderModifier, IIssueOrder, IResolveOrder, IOrderVoice + class RenderSpy : RenderInfantryProne, IRenderModifier { - Player disguisedAsPlayer; string disguisedAsSprite; - - public RenderSpy(Actor self, RenderSpyInfo info) : base(self, info) { } + Spy spy; + + public RenderSpy(Actor self, RenderSpyInfo info) : base(self, info) + { + spy = self.Trait(); + disguisedAsSprite = spy.disguisedAsSprite; + } public IEnumerable ModifyRender(Actor self, IEnumerable r) { - return disguisedAsPlayer != null ? r.Select(a => a.WithPalette(disguisedAsPlayer.Palette)) : r; + return spy.disguisedAsPlayer != null ? r.Select(a => a.WithPalette(spy.disguisedAsPlayer.Palette)) : r; } public override void Tick(Actor self) { - base.Tick(self); - } - - public void ResolveOrder(Actor self, Order order) - { - if (order.OrderString == "Disguise") + if (spy.disguisedAsSprite != disguisedAsSprite) { - var target = order.TargetActor == self ? null : order.TargetActor; - if (target != null && target.IsInWorld) - { - disguisedAsPlayer = target.Owner; - disguisedAsSprite = target.Trait().GetImage(target); + disguisedAsSprite = spy.disguisedAsSprite; + if (disguisedAsSprite != null) anim.ChangeImage(disguisedAsSprite, "stand"); - } else - { - disguisedAsPlayer = null; - disguisedAsSprite = null; anim.ChangeImage(GetImage(self), "stand"); - } } - } - - public IEnumerable Orders - { - get { yield return new UnitTraitOrderTargeter( "Disguise", 5, "ability", true, true ); } - } - - public Order IssueOrder( Actor self, IOrderTargeter order, Target target, bool queued ) - { - if( order.OrderID == "Disguise" ) - return new Order(order.OrderID, self, queued) { TargetActor = target.Actor }; - - return null; - } - - public string VoicePhraseForOrder(Actor self, Order order) - { - return order.OrderString == "Disguise" ? "Attack" : null; + base.Tick(self); } } } diff --git a/OpenRA.Mods.RA/Spy.cs b/OpenRA.Mods.RA/Spy.cs index c5cd113e98..72ade7dc2a 100644 --- a/OpenRA.Mods.RA/Spy.cs +++ b/OpenRA.Mods.RA/Spy.cs @@ -9,28 +9,38 @@ #endregion using System.Drawing; +using System.Linq; using OpenRA.Mods.RA.Activities; using OpenRA.Mods.RA.Orders; using OpenRA.Traits; using OpenRA.Traits.Activities; using System.Collections.Generic; +using OpenRA.Mods.RA.Render; namespace OpenRA.Mods.RA { class SpyInfo : TraitInfo { } - class Spy : IIssueOrder, IResolveOrder + class Spy : IIssueOrder, IResolveOrder, IOrderVoice { + public Player disguisedAsPlayer; + public string disguisedAsSprite; + public IEnumerable Orders { - get { yield return new UnitTraitOrderTargeter( "SpyInfiltrate", 5, "enter", true, false ); } + get + { + yield return new UnitTraitOrderTargeter( "SpyInfiltrate", 5, "enter", true, false ); + yield return new UnitTraitOrderTargeter( "Disguise", 5, "ability", true, true ); + } } public Order IssueOrder( Actor self, IOrderTargeter order, Target target, bool queued ) { if( order.OrderID == "SpyInfiltrate" ) return new Order(order.OrderID, self, queued) { TargetActor = target.Actor }; - + if( order.OrderID == "Disguise" ) + return new Order(order.OrderID, self, queued) { TargetActor = target.Actor }; return null; } @@ -44,6 +54,25 @@ namespace OpenRA.Mods.RA self.QueueActivity(new Enter(order.TargetActor)); self.QueueActivity(new Infiltrate(order.TargetActor)); } + if (order.OrderString == "Disguise") + { + var target = order.TargetActor == self ? null : order.TargetActor; + if (target != null && target.IsInWorld) + { + disguisedAsPlayer = target.Owner; + disguisedAsSprite = target.Trait().GetImage(target); + } + else + { + disguisedAsPlayer = null; + disguisedAsSprite = null; + } + } + } + + public string VoicePhraseForOrder(Actor self, Order order) + { + return order.OrderString == "Disguise" ? "Attack" : null; } } }