diff --git a/OpenRA.Game/Orders/UnitOrderGenerator.cs b/OpenRA.Game/Orders/UnitOrderGenerator.cs index 6636c8db58..958c85d8b3 100644 --- a/OpenRA.Game/Orders/UnitOrderGenerator.cs +++ b/OpenRA.Game/Orders/UnitOrderGenerator.cs @@ -130,7 +130,7 @@ namespace OpenRA.Orders modifiers |= TargetModifiers.ForceMove; string cursor = null; - if (o.Order.CanTarget(self, target, actorsAt, modifiers, ref cursor)) + if (o.Order.CanTarget(self, target, actorsAt, ref modifiers, ref cursor)) return new UnitOrderResult(self, o.Order, o.Trait, cursor, target); } } diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index de5252edbf..f5ec0eb634 100644 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -97,7 +97,7 @@ namespace OpenRA.Traits { string OrderID { get; } int OrderPriority { get; } - bool CanTarget(Actor self, Target target, List othersAtTarget, TargetModifiers modifiers, ref string cursor); + bool CanTarget(Actor self, Target target, List othersAtTarget, ref TargetModifiers modifiers, ref string cursor); bool IsQueued { get; } bool OverrideSelection { get; } } diff --git a/OpenRA.Mods.Common/Orders/AircraftMoveOrderTargeter.cs b/OpenRA.Mods.Common/Orders/AircraftMoveOrderTargeter.cs index ee87282d44..81e54de9ee 100644 --- a/OpenRA.Mods.Common/Orders/AircraftMoveOrderTargeter.cs +++ b/OpenRA.Mods.Common/Orders/AircraftMoveOrderTargeter.cs @@ -24,7 +24,7 @@ namespace OpenRA.Mods.Common.Orders public AircraftMoveOrderTargeter(AircraftInfo info) { this.info = info; } - public bool CanTarget(Actor self, Target target, List othersAtTarget, TargetModifiers modifiers, ref string cursor) + public bool CanTarget(Actor self, Target target, List othersAtTarget, ref TargetModifiers modifiers, ref string cursor) { if (target.Type != TargetType.Terrain) return false; diff --git a/OpenRA.Mods.Common/Orders/DeployOrderTargeter.cs b/OpenRA.Mods.Common/Orders/DeployOrderTargeter.cs index 8337d6dfc4..da6b8818fd 100644 --- a/OpenRA.Mods.Common/Orders/DeployOrderTargeter.cs +++ b/OpenRA.Mods.Common/Orders/DeployOrderTargeter.cs @@ -34,7 +34,7 @@ namespace OpenRA.Mods.Common.Orders public int OrderPriority { get; private set; } public bool OverrideSelection { get { return true; } } - public bool CanTarget(Actor self, Target target, List othersAtTarget, TargetModifiers modifiers, ref string cursor) + public bool CanTarget(Actor self, Target target, List othersAtTarget, ref TargetModifiers modifiers, ref string cursor) { if (target.Type != TargetType.Actor) return false; diff --git a/OpenRA.Mods.Common/Orders/UnitOrderTargeter.cs b/OpenRA.Mods.Common/Orders/UnitOrderTargeter.cs index 863c9e54ba..f6a82fa872 100644 --- a/OpenRA.Mods.Common/Orders/UnitOrderTargeter.cs +++ b/OpenRA.Mods.Common/Orders/UnitOrderTargeter.cs @@ -36,7 +36,7 @@ namespace OpenRA.Mods.Common.Orders public abstract bool CanTargetActor(Actor self, Actor target, TargetModifiers modifiers, ref string cursor); public abstract bool CanTargetFrozenActor(Actor self, FrozenActor target, TargetModifiers modifiers, ref string cursor); - public bool CanTarget(Actor self, Target target, List othersAtTarget, TargetModifiers modifiers, ref string cursor) + public bool CanTarget(Actor self, Target target, List othersAtTarget, ref TargetModifiers modifiers, ref string cursor) { var type = target.Type; if (type != TargetType.Actor && type != TargetType.FrozenActor) diff --git a/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs b/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs index 4a3dd9d0b6..9fe9105413 100644 --- a/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs +++ b/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs @@ -282,13 +282,21 @@ namespace OpenRA.Mods.Common.Traits public int OrderPriority { get; private set; } public bool OverrideSelection { get { return true; } } - bool CanTargetActor(Actor self, Target target, TargetModifiers modifiers, ref string cursor) + bool CanTargetActor(Actor self, Target target, ref TargetModifiers modifiers, ref string cursor) { IsQueued = modifiers.HasModifier(TargetModifiers.ForceQueue); if (modifiers.HasModifier(TargetModifiers.ForceMove)) return false; + // Disguised actors are revealed by the attack cursor + // HACK: works around limitations in the targeting code that force the + // targeting and attacking logic (which should be logically separate) + // to use the same code + if (target.Type == TargetType.Actor && target.Actor.EffectiveOwner != null && + target.Actor.EffectiveOwner.Disguised && self.Owner.Stances[target.Actor.Owner] == Stance.Enemy) + modifiers |= TargetModifiers.ForceAttack; + var forceAttack = modifiers.HasModifier(TargetModifiers.ForceAttack); var a = ab.ChooseArmamentsForTarget(target, forceAttack).FirstOrDefault(); if (a == null) @@ -329,13 +337,13 @@ namespace OpenRA.Mods.Common.Traits return true; } - public bool CanTarget(Actor self, Target target, List othersAtTarget, TargetModifiers modifiers, ref string cursor) + public bool CanTarget(Actor self, Target target, List othersAtTarget, ref TargetModifiers modifiers, ref string cursor) { switch (target.Type) { case TargetType.Actor: case TargetType.FrozenActor: - return CanTargetActor(self, target, modifiers, ref cursor); + return CanTargetActor(self, target, ref modifiers, ref cursor); case TargetType.Terrain: return CanTargetLocation(self, self.World.Map.CellContaining(target.CenterPosition), othersAtTarget, modifiers, ref cursor); default: diff --git a/OpenRA.Mods.Common/Traits/Buildings/RallyPoint.cs b/OpenRA.Mods.Common/Traits/Buildings/RallyPoint.cs index 5908f30bc2..9cd6e19aba 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/RallyPoint.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/RallyPoint.cs @@ -84,7 +84,7 @@ namespace OpenRA.Mods.Common.Traits public int OrderPriority { get { return 0; } } public bool OverrideSelection { get { return true; } } - public bool CanTarget(Actor self, Target target, List othersAtTarget, TargetModifiers modifiers, ref string cursor) + public bool CanTarget(Actor self, Target target, List othersAtTarget, ref TargetModifiers modifiers, ref string cursor) { if (target.Type != TargetType.Terrain) return false; diff --git a/OpenRA.Mods.Common/Traits/Harvester.cs b/OpenRA.Mods.Common/Traits/Harvester.cs index 6e6f407b6d..b1c81497a0 100644 --- a/OpenRA.Mods.Common/Traits/Harvester.cs +++ b/OpenRA.Mods.Common/Traits/Harvester.cs @@ -453,7 +453,7 @@ namespace OpenRA.Mods.Common.Traits public bool IsQueued { get; protected set; } public bool OverrideSelection { get { return true; } } - public bool CanTarget(Actor self, Target target, List othersAtTarget, TargetModifiers modifiers, ref string cursor) + public bool CanTarget(Actor self, Target target, List othersAtTarget, ref TargetModifiers modifiers, ref string cursor) { if (target.Type != TargetType.Terrain) return false; diff --git a/OpenRA.Mods.Common/Traits/Mobile.cs b/OpenRA.Mods.Common/Traits/Mobile.cs index 79faf36081..835acd1ab0 100644 --- a/OpenRA.Mods.Common/Traits/Mobile.cs +++ b/OpenRA.Mods.Common/Traits/Mobile.cs @@ -707,7 +707,7 @@ namespace OpenRA.Mods.Common.Traits public int OrderPriority { get { return 4; } } public bool IsQueued { get; protected set; } - public bool CanTarget(Actor self, Target target, List othersAtTarget, TargetModifiers modifiers, ref string cursor) + public bool CanTarget(Actor self, Target target, List othersAtTarget, ref TargetModifiers modifiers, ref string cursor) { if (rejectMove || !target.IsValidFor(self)) return false; diff --git a/OpenRA.Mods.RA/Traits/Minelayer.cs b/OpenRA.Mods.RA/Traits/Minelayer.cs index f35ec224cc..6af1edf56b 100644 --- a/OpenRA.Mods.RA/Traits/Minelayer.cs +++ b/OpenRA.Mods.RA/Traits/Minelayer.cs @@ -199,7 +199,7 @@ namespace OpenRA.Mods.RA.Traits public int OrderPriority { get { return 5; } } public bool OverrideSelection { get { return true; } } - public bool CanTarget(Actor self, Target target, List othersAtTarget, TargetModifiers modifiers, ref string cursor) + public bool CanTarget(Actor self, Target target, List othersAtTarget, ref TargetModifiers modifiers, ref string cursor) { if (target.Type != TargetType.Terrain) return false; diff --git a/OpenRA.Mods.RA/Traits/PortableChrono.cs b/OpenRA.Mods.RA/Traits/PortableChrono.cs index e6babe13db..58ded32349 100644 --- a/OpenRA.Mods.RA/Traits/PortableChrono.cs +++ b/OpenRA.Mods.RA/Traits/PortableChrono.cs @@ -120,7 +120,7 @@ namespace OpenRA.Mods.RA.Traits public bool IsQueued { get; protected set; } public bool OverrideSelection { get { return true; } } - public bool CanTarget(Actor self, Target target, List othersAtTarget, TargetModifiers modifiers, ref string cursor) + public bool CanTarget(Actor self, Target target, List othersAtTarget, ref TargetModifiers modifiers, ref string cursor) { // TODO: When target modifiers are configurable this needs to be revisited if (modifiers.HasModifier(TargetModifiers.ForceMove) || modifiers.HasModifier(TargetModifiers.ForceQueue))