From d967c564a2dec515ef2afec9ca2790ef6b4381a5 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sun, 15 Oct 2017 16:45:16 +0000 Subject: [PATCH] Remove TargetActor and TargetLocation from order issuing. --- OpenRA.Game/Network/Order.cs | 4 +-- OpenRA.Game/Orders/GenericSelectTarget.cs | 3 ++- OpenRA.Mods.Cnc/Traits/Disguise.cs | 2 +- .../Traits/Infiltration/Infiltrates.cs | 5 +--- OpenRA.Mods.Cnc/Traits/MadTank.cs | 5 +--- OpenRA.Mods.Cnc/Traits/Minelayer.cs | 8 +++--- OpenRA.Mods.Cnc/Traits/PortableChrono.cs | 6 ++--- .../Traits/SupportPowers/AttackOrderPower.cs | 3 +-- .../Traits/SupportPowers/ChronoshiftPower.cs | 3 +-- OpenRA.Mods.Common/AI/BaseBuilder.cs | 8 +++--- OpenRA.Mods.Common/AI/HackyAI.cs | 17 +++++++----- OpenRA.Mods.Common/AI/States/AirStates.cs | 4 +-- OpenRA.Mods.Common/AI/States/GroundStates.cs | 8 +++--- OpenRA.Mods.Common/AI/States/NavyStates.cs | 8 +++--- .../AI/States/ProtectionStates.cs | 4 ++- OpenRA.Mods.Common/AI/States/StateBase.cs | 2 +- .../Orders/BeaconOrderGenerator.cs | 3 ++- .../Orders/GuardOrderGenerator.cs | 3 ++- .../Orders/PlaceBuildingOrderGenerator.cs | 11 ++++---- .../Orders/RepairOrderGenerator.cs | 4 +-- OpenRA.Mods.Common/Traits/Air/Aircraft.cs | 7 ++--- .../Traits/Attack/AttackBase.cs | 12 +-------- .../Traits/Attack/AttackSuicides.cs | 5 +--- OpenRA.Mods.Common/Traits/AttackMove.cs | 2 +- OpenRA.Mods.Common/Traits/AttackWander.cs | 2 +- .../Traits/Buildings/RallyPoint.cs | 2 +- OpenRA.Mods.Common/Traits/Captures.cs | 5 +--- OpenRA.Mods.Common/Traits/Carryall.cs | 17 ++---------- OpenRA.Mods.Common/Traits/DeliversCash.cs | 5 +--- .../Traits/DeliversExperience.cs | 5 +--- OpenRA.Mods.Common/Traits/Demolition.cs | 5 +--- OpenRA.Mods.Common/Traits/EngineerRepair.cs | 5 +--- OpenRA.Mods.Common/Traits/EntersTunnels.cs | 5 +--- OpenRA.Mods.Common/Traits/ExternalCaptures.cs | 5 +--- OpenRA.Mods.Common/Traits/Harvester.cs | 7 ++--- OpenRA.Mods.Common/Traits/Mobile.cs | 2 +- OpenRA.Mods.Common/Traits/Passenger.cs | 2 +- .../Traits/Player/PlaceBuilding.cs | 5 ++-- OpenRA.Mods.Common/Traits/Repairable.cs | 2 +- OpenRA.Mods.Common/Traits/RepairableNear.cs | 2 +- OpenRA.Mods.Common/Traits/RepairsBridges.cs | 2 +- .../GrantExternalConditionPower.cs | 2 +- .../SupportPowers/SupportPowerManager.cs | 2 +- OpenRA.Mods.Common/Traits/Wanders.cs | 2 +- OpenRA.Test/OpenRA.Game/OrderTest.cs | 27 ++++++++++++------- 45 files changed, 104 insertions(+), 144 deletions(-) diff --git a/OpenRA.Game/Network/Order.cs b/OpenRA.Game/Network/Order.cs index ab1621c4e1..9bc9f3900b 100644 --- a/OpenRA.Game/Network/Order.cs +++ b/OpenRA.Game/Network/Order.cs @@ -40,8 +40,8 @@ namespace OpenRA public readonly string OrderString; public readonly Actor Subject; public readonly bool Queued; - public Actor TargetActor; - public CPos TargetLocation; + public Actor TargetActor { get; private set; } + public CPos TargetLocation { get; private set; } public string TargetString; public CPos ExtraLocation; public uint ExtraData; diff --git a/OpenRA.Game/Orders/GenericSelectTarget.cs b/OpenRA.Game/Orders/GenericSelectTarget.cs index 6633fa9fea..8d311b1f6d 100644 --- a/OpenRA.Game/Orders/GenericSelectTarget.cs +++ b/OpenRA.Game/Orders/GenericSelectTarget.cs @@ -10,6 +10,7 @@ #endregion using System.Collections.Generic; +using OpenRA.Traits; namespace OpenRA.Orders { @@ -52,7 +53,7 @@ namespace OpenRA.Orders var queued = mi.Modifiers.HasModifier(Modifiers.Shift); foreach (var subject in Subjects) - yield return new Order(OrderName, subject, queued) { TargetLocation = cell }; + yield return new Order(OrderName, subject, Target.FromCell(world, cell), queued); } } diff --git a/OpenRA.Mods.Cnc/Traits/Disguise.cs b/OpenRA.Mods.Cnc/Traits/Disguise.cs index 2f331b784b..46c9ffd105 100644 --- a/OpenRA.Mods.Cnc/Traits/Disguise.cs +++ b/OpenRA.Mods.Cnc/Traits/Disguise.cs @@ -124,7 +124,7 @@ namespace OpenRA.Mods.Cnc.Traits public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued) { if (order.OrderID == "Disguise") - return new Order(order.OrderID, self, queued) { TargetActor = target.Actor }; + return new Order(order.OrderID, self, target, queued); return null; } diff --git a/OpenRA.Mods.Cnc/Traits/Infiltration/Infiltrates.cs b/OpenRA.Mods.Cnc/Traits/Infiltration/Infiltrates.cs index 46ef3c9102..6f2274ed7e 100644 --- a/OpenRA.Mods.Cnc/Traits/Infiltration/Infiltrates.cs +++ b/OpenRA.Mods.Cnc/Traits/Infiltration/Infiltrates.cs @@ -64,10 +64,7 @@ namespace OpenRA.Mods.Cnc.Traits if (order.OrderID != "Infiltrate") return null; - if (target.Type == TargetType.FrozenActor) - return new Order(order.OrderID, self, queued) { ExtraData = target.FrozenActor.ID }; - - return new Order(order.OrderID, self, queued) { TargetActor = target.Actor }; + return new Order(order.OrderID, self, target, queued); } bool IsValidOrder(Actor self, Order order) diff --git a/OpenRA.Mods.Cnc/Traits/MadTank.cs b/OpenRA.Mods.Cnc/Traits/MadTank.cs index 3289221824..c6f0060b9f 100644 --- a/OpenRA.Mods.Cnc/Traits/MadTank.cs +++ b/OpenRA.Mods.Cnc/Traits/MadTank.cs @@ -121,10 +121,7 @@ namespace OpenRA.Mods.Cnc.Traits if (order.OrderID != "DetonateAttack" && order.OrderID != "Detonate") return null; - if (target.Type == TargetType.FrozenActor) - return new Order(order.OrderID, self, queued) { ExtraData = target.FrozenActor.ID }; - - return new Order(order.OrderID, self, queued) { TargetActor = target.Actor }; + return new Order(order.OrderID, self, target, queued); } Order IIssueDeployOrder.IssueDeployOrder(Actor self) diff --git a/OpenRA.Mods.Cnc/Traits/Minelayer.cs b/OpenRA.Mods.Cnc/Traits/Minelayer.cs index 1beda661c9..7e49e1af74 100644 --- a/OpenRA.Mods.Cnc/Traits/Minelayer.cs +++ b/OpenRA.Mods.Cnc/Traits/Minelayer.cs @@ -73,9 +73,9 @@ namespace OpenRA.Mods.Cnc.Traits else self.World.OrderGenerator = new MinefieldOrderGenerator(self, start); - return new Order("BeginMinefield", self, false) { TargetLocation = start }; + return new Order("BeginMinefield", self, Target.FromCell(self.World, start), false); case "PlaceMine": - return new Order("PlaceMine", self, false) { TargetLocation = self.Location }; + return new Order("PlaceMine", self, Target.FromCell(self.World, self.Location), false); default: return null; } @@ -83,7 +83,7 @@ namespace OpenRA.Mods.Cnc.Traits Order IIssueDeployOrder.IssueDeployOrder(Actor self) { - return new Order("PlaceMine", self, false) { TargetLocation = self.Location }; + return new Order("PlaceMine", self, Target.FromCell(self.World, self.Location), false); } void IResolveOrder.ResolveOrder(Actor self, Order order) @@ -195,7 +195,7 @@ namespace OpenRA.Mods.Cnc.Traits { minelayers.First().World.CancelInputMode(); foreach (var minelayer in minelayers) - yield return new Order("PlaceMinefield", minelayer, false) { TargetLocation = cell }; + yield return new Order("PlaceMinefield", minelayer, Target.FromCell(world, cell), false); } } diff --git a/OpenRA.Mods.Cnc/Traits/PortableChrono.cs b/OpenRA.Mods.Cnc/Traits/PortableChrono.cs index 2004ad2885..f459095fbc 100644 --- a/OpenRA.Mods.Cnc/Traits/PortableChrono.cs +++ b/OpenRA.Mods.Cnc/Traits/PortableChrono.cs @@ -88,9 +88,9 @@ namespace OpenRA.Mods.Cnc.Traits self.World.OrderGenerator = new PortableChronoOrderGenerator(self, Info); if (order.OrderID == "PortableChronoTeleport") - return new Order(order.OrderID, self, queued) { TargetLocation = self.World.Map.CellContaining(target.CenterPosition) }; + return new Order(order.OrderID, self, target, queued); - return new Order(order.OrderID, self, queued) { TargetActor = target.Actor }; + return null; } public void ResolveOrder(Actor self, Order order) @@ -185,7 +185,7 @@ namespace OpenRA.Mods.Cnc.Traits && self.Trait().CanTeleport && self.Owner.Shroud.IsExplored(cell)) { world.CancelInputMode(); - yield return new Order("PortableChronoTeleport", self, mi.Modifiers.HasModifier(Modifiers.Shift)) { TargetLocation = cell }; + yield return new Order("PortableChronoTeleport", self, Target.FromCell(world, cell), mi.Modifiers.HasModifier(Modifiers.Shift)); } } diff --git a/OpenRA.Mods.Cnc/Traits/SupportPowers/AttackOrderPower.cs b/OpenRA.Mods.Cnc/Traits/SupportPowers/AttackOrderPower.cs index 408386ac41..873c1b8177 100644 --- a/OpenRA.Mods.Cnc/Traits/SupportPowers/AttackOrderPower.cs +++ b/OpenRA.Mods.Cnc/Traits/SupportPowers/AttackOrderPower.cs @@ -97,9 +97,8 @@ namespace OpenRA.Mods.Cnc.Traits { world.CancelInputMode(); if (mi.Button == expectedButton && IsValidTarget(world, cell)) - yield return new Order(order, manager.Self, false) + yield return new Order(order, manager.Self, Target.FromCell(world, cell), false) { - TargetLocation = cell, SuppressVisualFeedback = true }; } diff --git a/OpenRA.Mods.Cnc/Traits/SupportPowers/ChronoshiftPower.cs b/OpenRA.Mods.Cnc/Traits/SupportPowers/ChronoshiftPower.cs index 8c2e8e41af..f3da501a94 100644 --- a/OpenRA.Mods.Cnc/Traits/SupportPowers/ChronoshiftPower.cs +++ b/OpenRA.Mods.Cnc/Traits/SupportPowers/ChronoshiftPower.cs @@ -221,9 +221,8 @@ namespace OpenRA.Mods.Cnc.Traits { // Cannot chronoshift into unexplored location if (IsValidTarget(xy)) - yield return new Order(order, manager.Self, false) + yield return new Order(order, manager.Self, Target.FromCell(manager.Self.World, xy), false) { - TargetLocation = xy, ExtraLocation = sourceLocation, SuppressVisualFeedback = true }; diff --git a/OpenRA.Mods.Common/AI/BaseBuilder.cs b/OpenRA.Mods.Common/AI/BaseBuilder.cs index 5c98d1e8b0..aa2f0f8937 100644 --- a/OpenRA.Mods.Common/AI/BaseBuilder.cs +++ b/OpenRA.Mods.Common/AI/BaseBuilder.cs @@ -157,11 +157,13 @@ namespace OpenRA.Mods.Common.AI else { failCount = 0; - ai.QueueOrder(new Order("PlaceBuilding", player.PlayerActor, false) + ai.QueueOrder(new Order("PlaceBuilding", player.PlayerActor, Target.FromCell(world, location.Value), false) { - TargetLocation = location.Value, + // Building to place TargetString = currentBuilding.Item, - TargetActor = queue.Actor, + + // Actor ID to associate the placement with + ExtraData = queue.Actor.ActorID, SuppressVisualFeedback = true }); diff --git a/OpenRA.Mods.Common/AI/HackyAI.cs b/OpenRA.Mods.Common/AI/HackyAI.cs index a2c3ca6bf2..f4cd009226 100644 --- a/OpenRA.Mods.Common/AI/HackyAI.cs +++ b/OpenRA.Mods.Common/AI/HackyAI.cs @@ -757,7 +757,7 @@ namespace OpenRA.Mods.Common.AI if (target.Actor == null) return; - QueueOrder(new Order(target.OrderString, capturer, true) { TargetActor = target.Actor }); + QueueOrder(new Order(target.OrderString, capturer, Target.FromActor(target.Actor), true)); BotDebug("AI ({0}): Ordered {1} to capture {2}", Player.ClientIndex, capturer, target.Actor); activeUnits.Remove(capturer); } @@ -813,7 +813,7 @@ namespace OpenRA.Mods.Common.AI // Tell the idle harvester to quit slacking: var newSafeResourcePatch = FindNextResource(harvester, harv); BotDebug("AI: Harvester {0} is idle. Ordering to {1} in search for new resources.".F(harvester, newSafeResourcePatch)); - QueueOrder(new Order("Harvest", harvester, false) { TargetLocation = newSafeResourcePatch }); + QueueOrder(new Order("Harvest", harvester, Target.FromCell(World, newSafeResourcePatch), false)); } } @@ -927,13 +927,16 @@ namespace OpenRA.Mods.Common.AI void SetRallyPointsForNewProductionBuildings(Actor self) { foreach (var rp in self.World.ActorsWithTrait()) + { if (rp.Actor.Owner == Player && !IsRallyPointValid(rp.Trait.Location, rp.Actor.Info.TraitInfoOrDefault())) - QueueOrder(new Order("SetRallyPoint", rp.Actor, false) + { + QueueOrder(new Order("SetRallyPoint", rp.Actor, Target.FromCell(World, ChooseRallyLocationNear(rp.Actor)), false) { - TargetLocation = ChooseRallyLocationNear(rp.Actor), SuppressVisualFeedback = true }); + } + } } // Won't work for shipyards... @@ -992,7 +995,7 @@ namespace OpenRA.Mods.Common.AI if (desiredLocation == null) continue; - QueueOrder(new Order("Move", mcv, true) { TargetLocation = desiredLocation.Value }); + QueueOrder(new Order("Move", mcv, Target.FromCell(World, desiredLocation.Value), true)); QueueOrder(new Order("DeployTransform", mcv, true)); } } @@ -1047,7 +1050,7 @@ namespace OpenRA.Mods.Common.AI // Valid target found, delay by a few ticks to avoid rescanning before power fires via order BotDebug("AI: {2} found new target location {0} for support power {1}.", attackLocation, sp.Info.OrderName, Player.PlayerName); waitingPowers[sp] += 10; - QueueOrder(new Order(sp.Key, supportPowerMngr.Self, false) { TargetLocation = attackLocation.Value, SuppressVisualFeedback = true }); + QueueOrder(new Order(sp.Key, supportPowerMngr.Self, Target.FromCell(World, attackLocation.Value), false) { SuppressVisualFeedback = true }); } } } @@ -1199,7 +1202,7 @@ namespace OpenRA.Mods.Common.AI { BotDebug("Bot noticed damage {0} {1}->{2}, repairing.", self, e.PreviousDamageState, e.DamageState); - QueueOrder(new Order("RepairBuilding", self.Owner.PlayerActor, false) { TargetActor = self }); + QueueOrder(new Order("RepairBuilding", self.Owner.PlayerActor, Target.FromActor(self), false)); } } diff --git a/OpenRA.Mods.Common/AI/States/AirStates.cs b/OpenRA.Mods.Common/AI/States/AirStates.cs index 1795dd888a..cb0de55147 100644 --- a/OpenRA.Mods.Common/AI/States/AirStates.cs +++ b/OpenRA.Mods.Common/AI/States/AirStates.cs @@ -223,7 +223,7 @@ namespace OpenRA.Mods.Common.AI } if (CanAttackTarget(a, owner.TargetActor)) - owner.Bot.QueueOrder(new Order("Attack", a, false) { TargetActor = owner.TargetActor }); + owner.Bot.QueueOrder(new Order("Attack", a, Target.FromActor(owner.TargetActor), false)); } } @@ -250,7 +250,7 @@ namespace OpenRA.Mods.Common.AI continue; } - owner.Bot.QueueOrder(new Order("Move", a, false) { TargetLocation = RandomBuildingLocation(owner) }); + owner.Bot.QueueOrder(new Order("Move", a, Target.FromCell(owner.World, RandomBuildingLocation(owner)), false)); } owner.FuzzyStateMachine.ChangeState(owner, new AirIdleState(), true); diff --git a/OpenRA.Mods.Common/AI/States/GroundStates.cs b/OpenRA.Mods.Common/AI/States/GroundStates.cs index a424302df5..b9e33ea7a7 100644 --- a/OpenRA.Mods.Common/AI/States/GroundStates.cs +++ b/OpenRA.Mods.Common/AI/States/GroundStates.cs @@ -54,7 +54,7 @@ namespace OpenRA.Mods.Common.AI if (AttackOrFleeFuzzy.Default.CanAttack(owner.Units, enemyUnits)) { foreach (var u in owner.Units) - owner.Bot.QueueOrder(new Order("AttackMove", u, false) { TargetLocation = owner.TargetActor.Location }); + owner.Bot.QueueOrder(new Order("AttackMove", u, Target.FromCell(owner.World, owner.TargetActor.Location), false)); // We have gathered sufficient units. Attack the nearest enemy unit. owner.FuzzyStateMachine.ChangeState(owner, new GroundUnitsAttackMoveState(), true); @@ -100,7 +100,7 @@ namespace OpenRA.Mods.Common.AI // Let them regroup into tighter formation. owner.Bot.QueueOrder(new Order("Stop", leader, false)); foreach (var unit in owner.Units.Where(a => !ownUnits.Contains(a))) - owner.Bot.QueueOrder(new Order("AttackMove", unit, false) { TargetLocation = leader.Location }); + owner.Bot.QueueOrder(new Order("AttackMove", unit, Target.FromCell(owner.World, leader.Location), false)); } else { @@ -114,7 +114,7 @@ namespace OpenRA.Mods.Common.AI } else foreach (var a in owner.Units) - owner.Bot.QueueOrder(new Order("AttackMove", a, false) { TargetLocation = owner.TargetActor.Location }); + owner.Bot.QueueOrder(new Order("AttackMove", a, Target.FromCell(owner.World, owner.TargetActor.Location), false)); } if (ShouldFlee(owner)) @@ -147,7 +147,7 @@ namespace OpenRA.Mods.Common.AI foreach (var a in owner.Units) if (!BusyAttack(a)) - owner.Bot.QueueOrder(new Order("Attack", a, false) { TargetActor = owner.TargetActor }); + owner.Bot.QueueOrder(new Order("Attack", a, Target.FromActor(owner.TargetActor), false)); if (ShouldFlee(owner)) owner.FuzzyStateMachine.ChangeState(owner, new GroundUnitsFleeState(), true); diff --git a/OpenRA.Mods.Common/AI/States/NavyStates.cs b/OpenRA.Mods.Common/AI/States/NavyStates.cs index 604a657759..395edf9643 100644 --- a/OpenRA.Mods.Common/AI/States/NavyStates.cs +++ b/OpenRA.Mods.Common/AI/States/NavyStates.cs @@ -81,7 +81,7 @@ namespace OpenRA.Mods.Common.AI if (AttackOrFleeFuzzy.Default.CanAttack(owner.Units, enemyUnits)) { foreach (var u in owner.Units) - owner.Bot.QueueOrder(new Order("AttackMove", u, false) { TargetLocation = owner.TargetActor.Location }); + owner.Bot.QueueOrder(new Order("AttackMove", u, Target.FromCell(owner.World, owner.TargetActor.Location), false)); // We have gathered sufficient units. Attack the nearest enemy unit. owner.FuzzyStateMachine.ChangeState(owner, new NavyUnitsAttackMoveState(), true); @@ -127,7 +127,7 @@ namespace OpenRA.Mods.Common.AI // Let them regroup into tighter formation. owner.Bot.QueueOrder(new Order("Stop", leader, false)); foreach (var unit in owner.Units.Where(a => !ownUnits.Contains(a))) - owner.Bot.QueueOrder(new Order("AttackMove", unit, false) { TargetLocation = leader.Location }); + owner.Bot.QueueOrder(new Order("AttackMove", unit, Target.FromCell(owner.World, leader.Location), false)); } else { @@ -141,7 +141,7 @@ namespace OpenRA.Mods.Common.AI } else foreach (var a in owner.Units) - owner.Bot.QueueOrder(new Order("AttackMove", a, false) { TargetLocation = owner.TargetActor.Location }); + owner.Bot.QueueOrder(new Order("AttackMove", a, Target.FromCell(owner.World, owner.TargetActor.Location), false)); } if (ShouldFlee(owner)) @@ -174,7 +174,7 @@ namespace OpenRA.Mods.Common.AI foreach (var a in owner.Units) if (!BusyAttack(a)) - owner.Bot.QueueOrder(new Order("Attack", a, false) { TargetActor = owner.TargetActor }); + owner.Bot.QueueOrder(new Order("Attack", a, Target.FromActor(owner.TargetActor), false)); if (ShouldFlee(owner)) owner.FuzzyStateMachine.ChangeState(owner, new NavyUnitsFleeState(), true); diff --git a/OpenRA.Mods.Common/AI/States/ProtectionStates.cs b/OpenRA.Mods.Common/AI/States/ProtectionStates.cs index 1a7133809d..df80636bfc 100644 --- a/OpenRA.Mods.Common/AI/States/ProtectionStates.cs +++ b/OpenRA.Mods.Common/AI/States/ProtectionStates.cs @@ -9,6 +9,8 @@ */ #endregion +using OpenRA.Traits; + namespace OpenRA.Mods.Common.AI { class UnitsForProtectionIdleState : GroundStateBase, IState @@ -55,7 +57,7 @@ namespace OpenRA.Mods.Common.AI else { foreach (var a in owner.Units) - owner.Bot.QueueOrder(new Order("AttackMove", a, false) { TargetLocation = owner.TargetActor.Location }); + owner.Bot.QueueOrder(new Order("AttackMove", a, Target.FromCell(owner.World, owner.TargetActor.Location), false)); } } diff --git a/OpenRA.Mods.Common/AI/States/StateBase.cs b/OpenRA.Mods.Common/AI/States/StateBase.cs index 922f41ff90..f9b7709804 100644 --- a/OpenRA.Mods.Common/AI/States/StateBase.cs +++ b/OpenRA.Mods.Common/AI/States/StateBase.cs @@ -26,7 +26,7 @@ namespace OpenRA.Mods.Common.AI { var loc = RandomBuildingLocation(squad); foreach (var a in squad.Units) - squad.Bot.QueueOrder(new Order("Move", a, false) { TargetLocation = loc }); + squad.Bot.QueueOrder(new Order("Move", a, Target.FromCell(squad.World, loc), false)); } protected static CPos RandomBuildingLocation(Squad squad) diff --git a/OpenRA.Mods.Common/Orders/BeaconOrderGenerator.cs b/OpenRA.Mods.Common/Orders/BeaconOrderGenerator.cs index e3b9d4cd12..730fd3073c 100644 --- a/OpenRA.Mods.Common/Orders/BeaconOrderGenerator.cs +++ b/OpenRA.Mods.Common/Orders/BeaconOrderGenerator.cs @@ -11,6 +11,7 @@ using System.Collections.Generic; using OpenRA.Graphics; +using OpenRA.Traits; namespace OpenRA.Mods.Common.Orders { @@ -21,7 +22,7 @@ namespace OpenRA.Mods.Common.Orders world.CancelInputMode(); if (mi.Button == MouseButton.Left) - yield return new Order("PlaceBeacon", world.LocalPlayer.PlayerActor, false) { TargetLocation = cell, SuppressVisualFeedback = true }; + yield return new Order("PlaceBeacon", world.LocalPlayer.PlayerActor, Target.FromCell(world, cell), false) { SuppressVisualFeedback = true }; } public virtual void Tick(World world) { } diff --git a/OpenRA.Mods.Common/Orders/GuardOrderGenerator.cs b/OpenRA.Mods.Common/Orders/GuardOrderGenerator.cs index 7504c4e75c..1898f6a3f4 100644 --- a/OpenRA.Mods.Common/Orders/GuardOrderGenerator.cs +++ b/OpenRA.Mods.Common/Orders/GuardOrderGenerator.cs @@ -13,6 +13,7 @@ using System.Collections.Generic; using System.Linq; using OpenRA.Mods.Common.Traits; using OpenRA.Orders; +using OpenRA.Traits; namespace OpenRA.Mods.Common.Orders { @@ -35,7 +36,7 @@ namespace OpenRA.Mods.Common.Orders var queued = mi.Modifiers.HasModifier(Modifiers.Shift); foreach (var subject in Subjects) if (subject != target) - yield return new Order(OrderName, subject, queued) { TargetActor = target }; + yield return new Order(OrderName, subject, Target.FromActor(target), queued); } public override void Tick(World world) diff --git a/OpenRA.Mods.Common/Orders/PlaceBuildingOrderGenerator.cs b/OpenRA.Mods.Common/Orders/PlaceBuildingOrderGenerator.cs index 492efe2bc2..a7c218b250 100644 --- a/OpenRA.Mods.Common/Orders/PlaceBuildingOrderGenerator.cs +++ b/OpenRA.Mods.Common/Orders/PlaceBuildingOrderGenerator.cs @@ -133,11 +133,13 @@ namespace OpenRA.Mods.Common.Orders orderType = "LineBuild"; } - yield return new Order(orderType, owner.PlayerActor, false) + yield return new Order(orderType, owner.PlayerActor, Target.FromCell(world, topLeft), false) { - TargetLocation = topLeft, - TargetActor = queue.Actor, + // Building to place TargetString = building, + + // Actor to associate the placement with + ExtraData = queue.Actor.ActorID, SuppressVisualFeedback = true }; } @@ -267,9 +269,8 @@ namespace OpenRA.Mods.Common.Orders if (availableCells.Count == 0) continue; - yield return new Order("Move", blocker.Actor, false) + yield return new Order("Move", blocker.Actor, Target.FromCell(world, blocker.Actor.ClosestCell(availableCells)), false) { - TargetLocation = blocker.Actor.ClosestCell(availableCells), SuppressVisualFeedback = true }; } diff --git a/OpenRA.Mods.Common/Orders/RepairOrderGenerator.cs b/OpenRA.Mods.Common/Orders/RepairOrderGenerator.cs index d9750fd19e..f20645ce54 100644 --- a/OpenRA.Mods.Common/Orders/RepairOrderGenerator.cs +++ b/OpenRA.Mods.Common/Orders/RepairOrderGenerator.cs @@ -43,7 +43,7 @@ namespace OpenRA.Mods.Common.Orders // Repair a building. if (underCursor.Info.HasTraitInfo()) - yield return new Order("RepairBuilding", world.LocalPlayer.PlayerActor, false) { TargetActor = underCursor }; + yield return new Order("RepairBuilding", world.LocalPlayer.PlayerActor, Target.FromActor(underCursor), false); // Don't command allied units if (underCursor.Owner != world.LocalPlayer) @@ -69,7 +69,7 @@ namespace OpenRA.Mods.Common.Orders if (repairBuilding == null) yield break; - yield return new Order(orderId, underCursor, false) { TargetActor = repairBuilding, VisualFeedbackTarget = underCursor }; + yield return new Order(orderId, underCursor, Target.FromActor(repairBuilding), false) { VisualFeedbackTarget = underCursor }; } public void Tick(World world) diff --git a/OpenRA.Mods.Common/Traits/Air/Aircraft.cs b/OpenRA.Mods.Common/Traits/Air/Aircraft.cs index 8f75e82bc1..9ea9e01f9a 100644 --- a/OpenRA.Mods.Common/Traits/Air/Aircraft.cs +++ b/OpenRA.Mods.Common/Traits/Air/Aircraft.cs @@ -655,11 +655,8 @@ namespace OpenRA.Mods.Common.Traits public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued) { - if (order.OrderID == "Enter") - return new Order(order.OrderID, self, queued) { TargetActor = target.Actor }; - - if (order.OrderID == "Move") - return new Order(order.OrderID, self, queued) { TargetLocation = self.World.Map.CellContaining(target.CenterPosition) }; + if (order.OrderID == "Enter" || order.OrderID == "Move") + return new Order(order.OrderID, self, target, queued); return null; } diff --git a/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs b/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs index 2b59dbdbcc..fc2d14b376 100644 --- a/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs +++ b/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs @@ -132,17 +132,7 @@ namespace OpenRA.Mods.Common.Traits Order IIssueOrder.IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued) { if (order is AttackOrderTargeter) - { - switch (target.Type) - { - case TargetType.Actor: - return new Order(order.OrderID, self, queued) { TargetActor = target.Actor }; - case TargetType.FrozenActor: - return new Order(order.OrderID, self, queued) { ExtraData = target.FrozenActor.ID }; - case TargetType.Terrain: - return new Order(order.OrderID, self, queued) { TargetLocation = self.World.Map.CellContaining(target.CenterPosition) }; - } - } + return new Order(order.OrderID, self, target, queued); return null; } diff --git a/OpenRA.Mods.Common/Traits/Attack/AttackSuicides.cs b/OpenRA.Mods.Common/Traits/Attack/AttackSuicides.cs index 1d22e0434f..525d2fb373 100644 --- a/OpenRA.Mods.Common/Traits/Attack/AttackSuicides.cs +++ b/OpenRA.Mods.Common/Traits/Attack/AttackSuicides.cs @@ -50,10 +50,7 @@ namespace OpenRA.Mods.Common.Traits if (order.OrderID != "DetonateAttack" && order.OrderID != "Detonate") return null; - if (target.Type == TargetType.FrozenActor) - return new Order(order.OrderID, self, queued) { ExtraData = target.FrozenActor.ID }; - - return new Order(order.OrderID, self, queued) { TargetActor = target.Actor }; + return new Order(order.OrderID, self, target, queued); } Order IIssueDeployOrder.IssueDeployOrder(Actor self) diff --git a/OpenRA.Mods.Common/Traits/AttackMove.cs b/OpenRA.Mods.Common/Traits/AttackMove.cs index a31c6422ab..ba58208cf7 100644 --- a/OpenRA.Mods.Common/Traits/AttackMove.cs +++ b/OpenRA.Mods.Common/Traits/AttackMove.cs @@ -150,7 +150,7 @@ namespace OpenRA.Mods.Common.Traits // Cells outside the playable area should be clamped to the edge for consistency with move orders cell = world.Map.Clamp(cell); foreach (var s in subjects) - yield return new Order(orderName, s.Actor, queued) { TargetLocation = cell }; + yield return new Order(orderName, s.Actor, Target.FromCell(world, cell), queued); } } diff --git a/OpenRA.Mods.Common/Traits/AttackWander.cs b/OpenRA.Mods.Common/Traits/AttackWander.cs index fb364bb278..0e4ddb25c1 100644 --- a/OpenRA.Mods.Common/Traits/AttackWander.cs +++ b/OpenRA.Mods.Common/Traits/AttackWander.cs @@ -32,7 +32,7 @@ namespace OpenRA.Mods.Common.Traits public override void DoAction(Actor self, CPos targetCell) { - attackMove.ResolveOrder(self, new Order("AttackMove", self, false) { TargetLocation = targetCell }); + attackMove.ResolveOrder(self, new Order("AttackMove", self, Target.FromCell(self.World, targetCell), false)); } } } diff --git a/OpenRA.Mods.Common/Traits/Buildings/RallyPoint.cs b/OpenRA.Mods.Common/Traits/Buildings/RallyPoint.cs index 8b3dbd88fc..5cd55b50b6 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/RallyPoint.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/RallyPoint.cs @@ -77,7 +77,7 @@ namespace OpenRA.Mods.Common.Traits public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued) { if (order.OrderID == OrderID) - return new Order(order.OrderID, self, false) { TargetLocation = self.World.Map.CellContaining(target.CenterPosition), SuppressVisualFeedback = true, + return new Order(order.OrderID, self, target, false) { SuppressVisualFeedback = true, ExtraData = ((RallyPointOrderTargeter)order).ForceSet ? ForceSet : 0 }; return null; diff --git a/OpenRA.Mods.Common/Traits/Captures.cs b/OpenRA.Mods.Common/Traits/Captures.cs index 20ddb0adfa..225863b92d 100644 --- a/OpenRA.Mods.Common/Traits/Captures.cs +++ b/OpenRA.Mods.Common/Traits/Captures.cs @@ -65,10 +65,7 @@ namespace OpenRA.Mods.Common.Traits if (order.OrderID != "CaptureActor") return null; - if (target.Type == TargetType.FrozenActor) - return new Order(order.OrderID, self, queued) { ExtraData = target.FrozenActor.ID }; - - return new Order(order.OrderID, self, queued) { TargetActor = target.Actor }; + return new Order(order.OrderID, self, target, queued); } public string VoicePhraseForOrder(Actor self, Order order) diff --git a/OpenRA.Mods.Common/Traits/Carryall.cs b/OpenRA.Mods.Common/Traits/Carryall.cs index 1f81334c85..3145b5b0eb 100644 --- a/OpenRA.Mods.Common/Traits/Carryall.cs +++ b/OpenRA.Mods.Common/Traits/Carryall.cs @@ -205,21 +205,8 @@ namespace OpenRA.Mods.Common.Traits Order IIssueOrder.IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued) { - if (order.OrderID == "PickupUnit") - { - if (target.Type == TargetType.FrozenActor) - return new Order(order.OrderID, self, queued) { ExtraData = target.FrozenActor.ID }; - - return new Order(order.OrderID, self, queued) { TargetActor = target.Actor }; - } - else if (order.OrderID == "DeliverUnit") - { - return new Order(order.OrderID, self, queued) { TargetLocation = self.World.Map.CellContaining(target.CenterPosition) }; - } - else if (order.OrderID == "Unload") - { - return new Order(order.OrderID, self, queued) { TargetLocation = self.World.Map.CellContaining(target.CenterPosition) }; - } + if (order.OrderID == "PickupUnit" || order.OrderID == "DeliverUnit" || order.OrderID == "Unload") + return new Order(order.OrderID, self, target, queued); return null; } diff --git a/OpenRA.Mods.Common/Traits/DeliversCash.cs b/OpenRA.Mods.Common/Traits/DeliversCash.cs index 45484f0bf6..b5b452d316 100644 --- a/OpenRA.Mods.Common/Traits/DeliversCash.cs +++ b/OpenRA.Mods.Common/Traits/DeliversCash.cs @@ -57,10 +57,7 @@ namespace OpenRA.Mods.Common.Traits if (order.OrderID != "DeliverCash") return null; - if (target.Type == TargetType.FrozenActor) - return new Order(order.OrderID, self, queued) { ExtraData = target.FrozenActor.ID }; - - return new Order(order.OrderID, self, queued) { TargetActor = target.Actor }; + return new Order(order.OrderID, self, target, queued); } public string VoicePhraseForOrder(Actor self, Order order) diff --git a/OpenRA.Mods.Common/Traits/DeliversExperience.cs b/OpenRA.Mods.Common/Traits/DeliversExperience.cs index 15192ba90f..708941fa3f 100644 --- a/OpenRA.Mods.Common/Traits/DeliversExperience.cs +++ b/OpenRA.Mods.Common/Traits/DeliversExperience.cs @@ -58,10 +58,7 @@ namespace OpenRA.Mods.Common.Traits if (order.OrderID != "DeliverExperience") return null; - if (target.Type == TargetType.FrozenActor) - return new Order(order.OrderID, self, queued) { ExtraData = target.FrozenActor.ID }; - - return new Order(order.OrderID, self, queued) { TargetActor = target.Actor }; + return new Order(order.OrderID, self, target, queued); } public string VoicePhraseForOrder(Actor self, Order order) diff --git a/OpenRA.Mods.Common/Traits/Demolition.cs b/OpenRA.Mods.Common/Traits/Demolition.cs index 8d4d61bf35..62a974f336 100644 --- a/OpenRA.Mods.Common/Traits/Demolition.cs +++ b/OpenRA.Mods.Common/Traits/Demolition.cs @@ -67,10 +67,7 @@ namespace OpenRA.Mods.Common.Traits if (order.OrderID != "C4") return null; - if (target.Type == TargetType.FrozenActor) - return new Order(order.OrderID, self, queued) { ExtraData = target.FrozenActor.ID }; - - return new Order(order.OrderID, self, queued) { TargetActor = target.Actor }; + return new Order(order.OrderID, self, target, queued); } public void ResolveOrder(Actor self, Order order) diff --git a/OpenRA.Mods.Common/Traits/EngineerRepair.cs b/OpenRA.Mods.Common/Traits/EngineerRepair.cs index d7acd7a136..fa4f5e363f 100644 --- a/OpenRA.Mods.Common/Traits/EngineerRepair.cs +++ b/OpenRA.Mods.Common/Traits/EngineerRepair.cs @@ -51,10 +51,7 @@ namespace OpenRA.Mods.Common.Traits if (order.OrderID != "EngineerRepair") return null; - if (target.Type == TargetType.FrozenActor) - return new Order(order.OrderID, self, queued) { ExtraData = target.FrozenActor.ID }; - - return new Order(order.OrderID, self, queued) { TargetActor = target.Actor }; + return new Order(order.OrderID, self, target, queued); } static bool IsValidOrder(Actor self, Order order) diff --git a/OpenRA.Mods.Common/Traits/EntersTunnels.cs b/OpenRA.Mods.Common/Traits/EntersTunnels.cs index 637761196f..26ce0aba50 100644 --- a/OpenRA.Mods.Common/Traits/EntersTunnels.cs +++ b/OpenRA.Mods.Common/Traits/EntersTunnels.cs @@ -52,10 +52,7 @@ namespace OpenRA.Mods.Common.Traits if (order.OrderID != "EnterTunnel") return null; - if (target.Type == TargetType.FrozenActor) - return new Order(order.OrderID, self, queued) { ExtraData = target.FrozenActor.ID, SuppressVisualFeedback = true }; - - return new Order(order.OrderID, self, queued) { TargetActor = target.Actor, SuppressVisualFeedback = true }; + return new Order(order.OrderID, self, target, queued) { SuppressVisualFeedback = true }; } public string VoicePhraseForOrder(Actor self, Order order) diff --git a/OpenRA.Mods.Common/Traits/ExternalCaptures.cs b/OpenRA.Mods.Common/Traits/ExternalCaptures.cs index de3750efe8..732750f03f 100644 --- a/OpenRA.Mods.Common/Traits/ExternalCaptures.cs +++ b/OpenRA.Mods.Common/Traits/ExternalCaptures.cs @@ -66,10 +66,7 @@ namespace OpenRA.Mods.Common.Traits if (order.OrderID != "ExternalCaptureActor") return null; - if (target.Type == TargetType.FrozenActor) - return new Order(order.OrderID, self, queued) { ExtraData = target.FrozenActor.ID }; - - return new Order(order.OrderID, self, queued) { TargetActor = target.Actor }; + return new Order(order.OrderID, self, target, queued); } static bool IsValidOrder(Actor self, Order order) diff --git a/OpenRA.Mods.Common/Traits/Harvester.cs b/OpenRA.Mods.Common/Traits/Harvester.cs index 90d8ae797b..f4d5538ee1 100644 --- a/OpenRA.Mods.Common/Traits/Harvester.cs +++ b/OpenRA.Mods.Common/Traits/Harvester.cs @@ -342,11 +342,8 @@ namespace OpenRA.Mods.Common.Traits public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued) { - if (order.OrderID == "Deliver") - return new Order(order.OrderID, self, queued) { TargetActor = target.Actor }; - - if (order.OrderID == "Harvest") - return new Order(order.OrderID, self, queued) { TargetLocation = self.World.Map.CellContaining(target.CenterPosition) }; + if (order.OrderID == "Deliver" || order.OrderID == "Harvest") + return new Order(order.OrderID, self, target, queued); return null; } diff --git a/OpenRA.Mods.Common/Traits/Mobile.cs b/OpenRA.Mods.Common/Traits/Mobile.cs index bb774fc69b..38e81adf1b 100644 --- a/OpenRA.Mods.Common/Traits/Mobile.cs +++ b/OpenRA.Mods.Common/Traits/Mobile.cs @@ -585,7 +585,7 @@ namespace OpenRA.Mods.Common.Traits public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued) { if (order is MoveOrderTargeter) - return new Order("Move", self, queued) { TargetLocation = self.World.Map.CellContaining(target.CenterPosition) }; + return new Order("Move", self, target, queued); return null; } diff --git a/OpenRA.Mods.Common/Traits/Passenger.cs b/OpenRA.Mods.Common/Traits/Passenger.cs index 46dc0326a7..2cc91ecf37 100644 --- a/OpenRA.Mods.Common/Traits/Passenger.cs +++ b/OpenRA.Mods.Common/Traits/Passenger.cs @@ -66,7 +66,7 @@ namespace OpenRA.Mods.Common.Traits public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued) { if (order.OrderID == "EnterTransport" || order.OrderID == "EnterTransports") - return new Order(order.OrderID, self, queued) { TargetActor = target.Actor }; + return new Order(order.OrderID, self, target, queued); return null; } diff --git a/OpenRA.Mods.Common/Traits/Player/PlaceBuilding.cs b/OpenRA.Mods.Common/Traits/Player/PlaceBuilding.cs index 8f7eac28c3..5cc9d3d26c 100644 --- a/OpenRA.Mods.Common/Traits/Player/PlaceBuilding.cs +++ b/OpenRA.Mods.Common/Traits/Player/PlaceBuilding.cs @@ -56,12 +56,13 @@ namespace OpenRA.Mods.Common.Traits self.World.AddFrameEndTask(w => { var prevItems = GetNumBuildables(self.Owner); + var targetActor = w.GetActorById(order.ExtraData); - if (order.TargetActor.IsDead) + if (targetActor.IsDead) return; var unit = self.World.Map.Rules.Actors[order.TargetString]; - var queue = order.TargetActor.TraitsImplementing() + var queue = targetActor.TraitsImplementing() .FirstOrDefault(q => q.CanBuild(unit) && q.CurrentItem() != null && q.CurrentItem().Item == order.TargetString && q.CurrentItem().RemainingTime == 0); if (queue == null) diff --git a/OpenRA.Mods.Common/Traits/Repairable.cs b/OpenRA.Mods.Common/Traits/Repairable.cs index d52e94d26b..2e2baa1802 100644 --- a/OpenRA.Mods.Common/Traits/Repairable.cs +++ b/OpenRA.Mods.Common/Traits/Repairable.cs @@ -55,7 +55,7 @@ namespace OpenRA.Mods.Common.Traits public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued) { if (order.OrderID == "Repair") - return new Order(order.OrderID, self, queued) { TargetActor = target.Actor }; + return new Order(order.OrderID, self, target, queued); return null; } diff --git a/OpenRA.Mods.Common/Traits/RepairableNear.cs b/OpenRA.Mods.Common/Traits/RepairableNear.cs index 09cbe625cf..46ac9a5ce9 100644 --- a/OpenRA.Mods.Common/Traits/RepairableNear.cs +++ b/OpenRA.Mods.Common/Traits/RepairableNear.cs @@ -52,7 +52,7 @@ namespace OpenRA.Mods.Common.Traits public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued) { if (order.OrderID == "RepairNear") - return new Order(order.OrderID, self, queued) { TargetActor = target.Actor }; + return new Order(order.OrderID, self, target, queued); return null; } diff --git a/OpenRA.Mods.Common/Traits/RepairsBridges.cs b/OpenRA.Mods.Common/Traits/RepairsBridges.cs index c3b2dc1d99..05c8db4d90 100644 --- a/OpenRA.Mods.Common/Traits/RepairsBridges.cs +++ b/OpenRA.Mods.Common/Traits/RepairsBridges.cs @@ -55,7 +55,7 @@ namespace OpenRA.Mods.Common.Traits public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued) { if (order.OrderID == "RepairBridge") - return new Order(order.OrderID, self, queued) { TargetActor = target.Actor }; + return new Order(order.OrderID, self, target, queued); return null; } diff --git a/OpenRA.Mods.Common/Traits/SupportPowers/GrantExternalConditionPower.cs b/OpenRA.Mods.Common/Traits/SupportPowers/GrantExternalConditionPower.cs index eef1ea4196..f6f5f9d415 100644 --- a/OpenRA.Mods.Common/Traits/SupportPowers/GrantExternalConditionPower.cs +++ b/OpenRA.Mods.Common/Traits/SupportPowers/GrantExternalConditionPower.cs @@ -120,7 +120,7 @@ namespace OpenRA.Mods.Common.Traits { world.CancelInputMode(); if (mi.Button == MouseButton.Left && power.UnitsInRange(cell).Any()) - yield return new Order(order, manager.Self, false) { TargetLocation = cell, SuppressVisualFeedback = true }; + yield return new Order(order, manager.Self, Target.FromCell(world, cell), false) { SuppressVisualFeedback = true }; } public void Tick(World world) diff --git a/OpenRA.Mods.Common/Traits/SupportPowers/SupportPowerManager.cs b/OpenRA.Mods.Common/Traits/SupportPowers/SupportPowerManager.cs index 94be3fe6f4..a641af8d2e 100644 --- a/OpenRA.Mods.Common/Traits/SupportPowers/SupportPowerManager.cs +++ b/OpenRA.Mods.Common/Traits/SupportPowers/SupportPowerManager.cs @@ -280,7 +280,7 @@ namespace OpenRA.Mods.Common.Traits { world.CancelInputMode(); if (mi.Button == expectedButton && world.Map.Contains(cell)) - yield return new Order(order, manager.Self, false) { TargetLocation = cell, SuppressVisualFeedback = true }; + yield return new Order(order, manager.Self, Target.FromCell(world, cell), false) { SuppressVisualFeedback = true }; } public virtual void Tick(World world) diff --git a/OpenRA.Mods.Common/Traits/Wanders.cs b/OpenRA.Mods.Common/Traits/Wanders.cs index a41d69ded2..d1befb3788 100644 --- a/OpenRA.Mods.Common/Traits/Wanders.cs +++ b/OpenRA.Mods.Common/Traits/Wanders.cs @@ -115,7 +115,7 @@ namespace OpenRA.Mods.Common.Traits public virtual void DoAction(Actor self, CPos targetCell) { - move.ResolveOrder(self, new Order("Move", self, false) { TargetLocation = targetCell }); + move.ResolveOrder(self, new Order("Move", self, Target.FromCell(self.World, targetCell), false)); } } } diff --git a/OpenRA.Test/OpenRA.Game/OrderTest.cs b/OpenRA.Test/OpenRA.Game/OrderTest.cs index fe403c0b5b..5f6473822d 100644 --- a/OpenRA.Test/OpenRA.Game/OrderTest.cs +++ b/OpenRA.Test/OpenRA.Game/OrderTest.cs @@ -11,6 +11,7 @@ using System.IO; using NUnit.Framework; +using OpenRA.Traits; namespace OpenRA.Test { @@ -18,6 +19,7 @@ namespace OpenRA.Test public class OrderTest { Order order; + Order targetInvalid; Order immediateOrder; [SetUp] @@ -26,11 +28,12 @@ namespace OpenRA.Test order = new Order("TestOrder", null, false) { TargetString = "TestTarget", - TargetLocation = new CPos(1234, 5678), ExtraData = 1234, ExtraLocation = new CPos(555, 555) }; + targetInvalid = new Order("TestOrder", null, Target.Invalid, false); + immediateOrder = new Order("TestOrderImmediate", null, false) { IsImmediate = true, @@ -38,22 +41,28 @@ namespace OpenRA.Test }; } + Order RoundTripOrder(Order o) + { + var serializedData = new MemoryStream(o.Serialize()); + return Order.Deserialize(null, new BinaryReader(serializedData)); + } + [TestCase(TestName = "Data persists over serialization")] public void SerializeA() { - var serializedData = new MemoryStream(order.Serialize()); - var result = Order.Deserialize(null, new BinaryReader(serializedData)); - - Assert.That(result.ToString(), Is.EqualTo(order.ToString())); + Assert.That(RoundTripOrder(order).ToString(), Is.EqualTo(order.ToString())); } - [TestCase(TestName = "Data persists over serialization immediate")] + [TestCase(TestName = "Data persists over serialization (Immediate order)")] public void SerializeB() { - var serializedData = new MemoryStream(immediateOrder.Serialize()); - var result = Order.Deserialize(null, new BinaryReader(serializedData)); + Assert.That(RoundTripOrder(immediateOrder).ToString(), Is.EqualTo(immediateOrder.ToString())); + } - Assert.That(result.ToString(), Is.EqualTo(immediateOrder.ToString())); + [TestCase(TestName = "Data persists over serialization (Invalid target)")] + public void SerializeC() + { + Assert.That(RoundTripOrder(targetInvalid).ToString(), Is.EqualTo(targetInvalid.ToString())); } } }