From 124c0ea04130a7364852951fbad0b11c1f74a96f Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Mon, 16 Nov 2015 20:38:53 +0000 Subject: [PATCH 1/2] Make CanTarget modifiers a ref parameter. --- OpenRA.Game/Orders/UnitOrderGenerator.cs | 2 +- OpenRA.Game/Traits/TraitsInterfaces.cs | 2 +- OpenRA.Mods.Common/Orders/AircraftMoveOrderTargeter.cs | 2 +- OpenRA.Mods.Common/Orders/DeployOrderTargeter.cs | 2 +- OpenRA.Mods.Common/Orders/UnitOrderTargeter.cs | 2 +- OpenRA.Mods.Common/Traits/Attack/AttackBase.cs | 6 +++--- OpenRA.Mods.Common/Traits/Buildings/RallyPoint.cs | 2 +- OpenRA.Mods.Common/Traits/Harvester.cs | 2 +- OpenRA.Mods.Common/Traits/Mobile.cs | 2 +- OpenRA.Mods.RA/Traits/Minelayer.cs | 2 +- OpenRA.Mods.RA/Traits/PortableChrono.cs | 2 +- 11 files changed, 13 insertions(+), 13 deletions(-) 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 800317fdf4..d55e0638a5 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 09c7653da5..1fb15f0185 100644 --- a/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs +++ b/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs @@ -279,7 +279,7 @@ 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); @@ -326,13 +326,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)) From 65a7f2e863cfd72c83003a3a81371480ae84c713 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Mon, 16 Nov 2015 20:39:06 +0000 Subject: [PATCH 2/2] Restore earlier spy targeting behaviour. --- OpenRA.Mods.Common/Traits/Attack/AttackBase.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs b/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs index 1fb15f0185..b283073352 100644 --- a/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs +++ b/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs @@ -286,6 +286,14 @@ namespace OpenRA.Mods.Common.Traits 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)