From ed19969afe928da5e3ee2935973fdc4fd6dfa384 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Thu, 26 Dec 2013 15:48:05 +0100 Subject: [PATCH] obey force move commands on bridge demolition and repair --- OpenRA.Mods.RA/C4Demolition.cs | 30 +++++++++++++++++++++++++++++- OpenRA.Mods.RA/RepairsBridges.cs | 4 ++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/OpenRA.Mods.RA/C4Demolition.cs b/OpenRA.Mods.RA/C4Demolition.cs index da0dd64ab2..a233a4514a 100644 --- a/OpenRA.Mods.RA/C4Demolition.cs +++ b/OpenRA.Mods.RA/C4Demolition.cs @@ -33,7 +33,7 @@ namespace OpenRA.Mods.RA public IEnumerable Orders { - get { yield return new TargetTypeOrderTargeter("C4", "C4", 6, "c4", true, false); } + get { yield return new C4DemolitionOrderTargeter(); } } public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued) @@ -71,5 +71,33 @@ namespace OpenRA.Mods.RA { return order.OrderString == "C4" ? "Attack" : null; } + + class C4DemolitionOrderTargeter : UnitOrderTargeter + { + public C4DemolitionOrderTargeter() + : base("C4", 6, "c4", true, false) { } + + public override bool CanTargetActor(Actor self, Actor target, TargetModifiers modifiers, ref string cursor) + { + // Obey force moving onto bridges + if (modifiers.HasModifier(TargetModifiers.ForceMove)) + return false; + + var demolishable = target.TraitOrDefault(); + if (demolishable == null || !demolishable.IsValidTarget(target, self)) + return false; + + return true; + } + + public override bool CanTargetFrozenActor(Actor self, FrozenActor target, TargetModifiers modifiers, ref string cursor) + { + // TODO: Bridges don't yet support FrozenUnderFog. + if (target.Actor.HasTrait()) + return false; + + return true; + } + } } } diff --git a/OpenRA.Mods.RA/RepairsBridges.cs b/OpenRA.Mods.RA/RepairsBridges.cs index bc1bdcbd47..798da2f1aa 100644 --- a/OpenRA.Mods.RA/RepairsBridges.cs +++ b/OpenRA.Mods.RA/RepairsBridges.cs @@ -79,6 +79,10 @@ namespace OpenRA.Mods.RA if (!modifiers.HasModifier(TargetModifiers.ForceAttack) && damage != DamageState.Dead) return false; + // Obey force moving onto bridges + if (modifiers.HasModifier(TargetModifiers.ForceMove)) + return false; + // Can't repair an undamaged bridge if (damage == DamageState.Undamaged) cursor = "goldwrench-blocked";