diff --git a/OpenRA.Game/Actor.cs b/OpenRA.Game/Actor.cs index 9a916d0b72..a356a4198f 100755 --- a/OpenRA.Game/Actor.cs +++ b/OpenRA.Game/Actor.cs @@ -1,6 +1,6 @@ #region Copyright & License Information /* - * Copyright 2007-2011 The OpenRA Developers (see AUTHORS) + * Copyright 2007-2014 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, @@ -29,8 +29,10 @@ namespace OpenRA Lazy occupySpace; Lazy facing; Lazy health; + Lazy effectiveOwner; public IOccupySpace OccupiesSpace { get { return occupySpace.Value; } } + public IEffectiveOwner EffectiveOwner { get { return effectiveOwner.Value; } } public CPos Location { get { return occupySpace.Value.TopLeft; } } public WPos CenterPosition { get { return occupySpace.Value.CenterPosition; } } @@ -74,6 +76,7 @@ namespace OpenRA facing = Lazy.New(() => TraitOrDefault()); health = Lazy.New(() => TraitOrDefault()); + effectiveOwner = Lazy.New(() => TraitOrDefault()); applyIRender = (x, wr) => x.Render(this, wr); applyRenderModifier = (m, p, wr) => p.ModifyRender(this, wr, m); diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index fc55f92187..035a52e565 100755 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -1,6 +1,6 @@ #region Copyright & License Information /* - * Copyright 2007-2011 The OpenRA Developers (see AUTHORS) + * Copyright 2007-2014 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, @@ -84,6 +84,11 @@ namespace OpenRA.Traits bool IsValidTarget(Actor self, Actor saboteur); } public interface IStoreOre { int Capacity { get; } } + public interface IEffectiveOwner + { + bool Disguised { get; } + Player Owner { get; } + } public interface IToolTip { string Name(); diff --git a/OpenRA.Mods.RA/ActorExts.cs b/OpenRA.Mods.RA/ActorExts.cs index 360bfca05a..31ec3dc988 100644 --- a/OpenRA.Mods.RA/ActorExts.cs +++ b/OpenRA.Mods.RA/ActorExts.cs @@ -1,6 +1,6 @@ #region Copyright & License Information /* - * Copyright 2007-2011 The OpenRA Developers (see AUTHORS) + * Copyright 2007-2014 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, @@ -15,20 +15,14 @@ namespace OpenRA.Mods.RA { public static class ActorExts { - static bool IsDisguisedSpy(this Actor a) - { - var spy = a.TraitOrDefault(); - return spy != null && spy.Disguised; - } - public static bool AppearsFriendlyTo(this Actor self, Actor toActor) { var stance = toActor.Owner.Stances[self.Owner]; if (stance == Stance.Ally) return true; - if (self.IsDisguisedSpy() && !toActor.HasTrait()) - return toActor.Owner.Stances[self.Trait().disguisedAsPlayer] == Stance.Ally; + if (self.EffectiveOwner != null && self.EffectiveOwner.Disguised && !toActor.HasTrait()) + return toActor.Owner.Stances[self.EffectiveOwner.Owner] == Stance.Ally; return stance == Stance.Ally; } @@ -39,8 +33,8 @@ namespace OpenRA.Mods.RA if (stance == Stance.Ally) return false; /* otherwise, we'll hate friendly disguised spies */ - if (self.IsDisguisedSpy() && !toActor.HasTrait()) - return toActor.Owner.Stances[self.Trait().disguisedAsPlayer] == Stance.Enemy; + if (self.EffectiveOwner != null && self.EffectiveOwner.Disguised && !toActor.HasTrait()) + return toActor.Owner.Stances[self.EffectiveOwner.Owner] == Stance.Enemy; return stance == Stance.Enemy; }