diff --git a/OpenRA.Mods.RA/ActorExts.cs b/OpenRA.Mods.RA/ActorExts.cs index 9dedf3412b..9cca5a9595 100644 --- a/OpenRA.Mods.RA/ActorExts.cs +++ b/OpenRA.Mods.RA/ActorExts.cs @@ -9,6 +9,7 @@ #endregion using System; +using System.Drawing; using OpenRA.Traits; namespace OpenRA.Mods.RA @@ -44,6 +45,44 @@ namespace OpenRA.Mods.RA return stance == Stance.Enemy; } + + public static Target ResolveFrozenActorOrder(this Actor self, Order order, Color targetLine) + { + // Not targeting a frozen actor + if (order.ExtraData == 0) + return Target.FromOrder(order); + + // Targeted an actor under the fog + var frozenLayer = self.Owner.PlayerActor.TraitOrDefault(); + if (frozenLayer == null) + return Target.Invalid; + + var frozen = frozenLayer.FromID(order.ExtraData); + if (frozen == null) + return Target.Invalid; + + // Flashes the frozen proxy + self.SetTargetLine(frozen, targetLine, true); + + // Target is still alive - resolve the real order + if (frozen.Actor != null && frozen.Actor.IsInWorld) + return Target.FromActor(frozen.Actor); + + if (!order.Queued) + self.CancelActivity(); + + var move = self.TraitOrDefault(); + if (move != null) + { + // Move within sight range of the frozen actor + var sight = self.TraitOrDefault(); + var range = sight != null ? sight.Range : 2; + + self.QueueActivity(move.MoveWithinRange(Target.FromPos(frozen.CenterPosition), WRange.FromCells(range))); + } + + return Target.Invalid; + } } }