Add helper for resolving orders against frozen actors.

This commit is contained in:
Paul Chote
2013-08-09 23:44:12 +12:00
parent 3e605b1ee9
commit 53287ba2c8

View File

@@ -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<FrozenActorLayer>();
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<IMove>();
if (move != null)
{
// Move within sight range of the frozen actor
var sight = self.TraitOrDefault<RevealsShroud>();
var range = sight != null ? sight.Range : 2;
self.QueueActivity(move.MoveWithinRange(Target.FromPos(frozen.CenterPosition), WRange.FromCells(range)));
}
return Target.Invalid;
}
}
}