Migrate frozen actors from ExtraData to Target.

This commit is contained in:
Paul Chote
2017-10-15 19:37:15 +00:00
committed by Pavel Penev
parent 29c423772f
commit 5f9a67ed87
6 changed files with 26 additions and 88 deletions

View File

@@ -74,9 +74,7 @@ namespace OpenRA
TargetString = targetString;
Queued = queued;
ExtraLocation = extraLocation;
// TODO: remove FrozenActor ID after the various ResolveOrders that rely on it are updated
ExtraData = target.Type == TargetType.FrozenActor ? target.FrozenActor.ID : extraData;
ExtraData = extraData;
}
public static Order Deserialize(World world, BinaryReader r)

View File

@@ -72,29 +72,14 @@ namespace OpenRA.Mods.Cnc.Traits
if (IsTraitDisabled)
return false;
// Not targeting an actor
if (order.ExtraData == 0 && order.TargetActor == null)
return false;
IEnumerable<string> targetTypes = null;
if (order.Target.Type == TargetType.FrozenActor)
targetTypes = order.Target.FrozenActor.TargetTypes;
IEnumerable<string> targetTypes;
if (order.ExtraData != 0)
{
// Targeted an actor under the fog
var frozenLayer = self.Owner.PlayerActor.TraitOrDefault<FrozenActorLayer>();
if (frozenLayer == null)
return false;
var frozen = frozenLayer.FromID(order.ExtraData);
if (frozen == null)
return false;
targetTypes = frozen.TargetTypes;
}
else
if (order.Target.Type == TargetType.Actor)
targetTypes = order.TargetActor.GetEnabledTargetTypes();
return Info.Types.Overlaps(targetTypes);
return targetTypes != null && Info.Types.Overlaps(targetTypes);
}
public string VoicePhraseForOrder(Actor self, Order order)

View File

@@ -59,20 +59,16 @@ namespace OpenRA.Mods.Common
return stance == Stance.Enemy;
}
/// <summary>
/// DEPRECATED: Write code that can handle FrozenActors correctly instead.
/// </summary>
public static Target ResolveFrozenActorOrder(this Actor self, Order order, Color targetLine)
{
// Not targeting a frozen actor
if (order.ExtraData == 0)
return Target.FromOrder(self.World, order);
if (order.Target.Type != TargetType.FrozenActor)
return order.Target;
// 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;
var frozen = order.Target.FrozenActor;
// Flashes the frozen proxy
self.SetTargetLine(frozen, targetLine, true);

View File

@@ -159,28 +159,6 @@ namespace OpenRA.Mods.Common.Traits
self.CancelActivity();
}
static Target TargetFromOrder(Actor self, Order order)
{
// Not targeting a frozen actor
if (order.ExtraData == 0)
return Target.FromOrder(self.World, 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;
// Target is still alive - resolve the real order
if (frozen.Actor != null && frozen.Actor.IsInWorld)
return Target.FromActor(frozen.Actor);
return Target.Invalid;
}
string IOrderVoice.VoicePhraseForOrder(Actor self, Order order)
{
return order.OrderString == attackOrderName || order.OrderString == forceAttackOrderName ? Info.Voice : null;

View File

@@ -56,25 +56,13 @@ namespace OpenRA.Mods.Common.Traits
static bool IsValidOrder(Actor self, Order order)
{
// Not targeting a frozen actor
if (order.ExtraData == 0 && order.TargetActor == null)
return false;
if (order.ExtraData != 0)
{
// Targeted an actor under the fog
var frozenLayer = self.Owner.PlayerActor.TraitOrDefault<FrozenActorLayer>();
if (frozenLayer == null)
return false;
var frozen = frozenLayer.FromID(order.ExtraData);
if (frozen == null)
return false;
return frozen.DamageState > DamageState.Undamaged;
}
if (order.Target.Type == TargetType.FrozenActor)
return order.Target.FrozenActor.DamageState > DamageState.Undamaged;
if (order.Target.Type == TargetType.Actor)
return order.TargetActor.GetDamageState() > DamageState.Undamaged;
return false;
}
public string VoicePhraseForOrder(Actor self, Order order)

View File

@@ -71,29 +71,22 @@ namespace OpenRA.Mods.Common.Traits
static bool IsValidOrder(Actor self, Order order)
{
// Not targeting an actor
if (order.ExtraData == 0 && order.TargetActor == null)
return false;
if (order.ExtraData != 0)
if (order.Target.Type == TargetType.FrozenActor)
{
// Targeted an actor under the fog
var frozenLayer = self.Owner.PlayerActor.TraitOrDefault<FrozenActorLayer>();
if (frozenLayer == null)
return false;
var frozen = frozenLayer.FromID(order.ExtraData);
if (frozen == null)
return false;
var frozen = order.Target.FrozenActor;
var ci = frozen.Info.TraitInfoOrDefault<ExternalCapturableInfo>();
return ci != null && ci.CanBeTargetedBy(self, frozen.Owner);
}
if (order.Target.Type == TargetType.Actor)
{
var c = order.TargetActor.TraitOrDefault<ExternalCapturable>();
return c != null && !c.CaptureInProgress && c.Info.CanBeTargetedBy(self, order.TargetActor.Owner);
}
return false;
}
public string VoicePhraseForOrder(Actor self, Order order)
{
return order.OrderString == "ExternalCaptureActor" && IsValidOrder(self, order)