Remove TargetActor and TargetLocation from order issuing.

This commit is contained in:
Paul Chote
2017-10-15 16:45:16 +00:00
committed by reaperrr
parent 4896a90b8d
commit d967c564a2
45 changed files with 104 additions and 144 deletions

View File

@@ -40,8 +40,8 @@ namespace OpenRA
public readonly string OrderString; public readonly string OrderString;
public readonly Actor Subject; public readonly Actor Subject;
public readonly bool Queued; public readonly bool Queued;
public Actor TargetActor; public Actor TargetActor { get; private set; }
public CPos TargetLocation; public CPos TargetLocation { get; private set; }
public string TargetString; public string TargetString;
public CPos ExtraLocation; public CPos ExtraLocation;
public uint ExtraData; public uint ExtraData;

View File

@@ -10,6 +10,7 @@
#endregion #endregion
using System.Collections.Generic; using System.Collections.Generic;
using OpenRA.Traits;
namespace OpenRA.Orders namespace OpenRA.Orders
{ {
@@ -52,7 +53,7 @@ namespace OpenRA.Orders
var queued = mi.Modifiers.HasModifier(Modifiers.Shift); var queued = mi.Modifiers.HasModifier(Modifiers.Shift);
foreach (var subject in Subjects) 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);
} }
} }

View File

@@ -124,7 +124,7 @@ namespace OpenRA.Mods.Cnc.Traits
public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued) public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued)
{ {
if (order.OrderID == "Disguise") if (order.OrderID == "Disguise")
return new Order(order.OrderID, self, queued) { TargetActor = target.Actor }; return new Order(order.OrderID, self, target, queued);
return null; return null;
} }

View File

@@ -64,10 +64,7 @@ namespace OpenRA.Mods.Cnc.Traits
if (order.OrderID != "Infiltrate") if (order.OrderID != "Infiltrate")
return null; return null;
if (target.Type == TargetType.FrozenActor) return new Order(order.OrderID, self, target, queued);
return new Order(order.OrderID, self, queued) { ExtraData = target.FrozenActor.ID };
return new Order(order.OrderID, self, queued) { TargetActor = target.Actor };
} }
bool IsValidOrder(Actor self, Order order) bool IsValidOrder(Actor self, Order order)

View File

@@ -121,10 +121,7 @@ namespace OpenRA.Mods.Cnc.Traits
if (order.OrderID != "DetonateAttack" && order.OrderID != "Detonate") if (order.OrderID != "DetonateAttack" && order.OrderID != "Detonate")
return null; return null;
if (target.Type == TargetType.FrozenActor) return new Order(order.OrderID, self, target, queued);
return new Order(order.OrderID, self, queued) { ExtraData = target.FrozenActor.ID };
return new Order(order.OrderID, self, queued) { TargetActor = target.Actor };
} }
Order IIssueDeployOrder.IssueDeployOrder(Actor self) Order IIssueDeployOrder.IssueDeployOrder(Actor self)

View File

@@ -73,9 +73,9 @@ namespace OpenRA.Mods.Cnc.Traits
else else
self.World.OrderGenerator = new MinefieldOrderGenerator(self, start); 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": case "PlaceMine":
return new Order("PlaceMine", self, false) { TargetLocation = self.Location }; return new Order("PlaceMine", self, Target.FromCell(self.World, self.Location), false);
default: default:
return null; return null;
} }
@@ -83,7 +83,7 @@ namespace OpenRA.Mods.Cnc.Traits
Order IIssueDeployOrder.IssueDeployOrder(Actor self) 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) void IResolveOrder.ResolveOrder(Actor self, Order order)
@@ -195,7 +195,7 @@ namespace OpenRA.Mods.Cnc.Traits
{ {
minelayers.First().World.CancelInputMode(); minelayers.First().World.CancelInputMode();
foreach (var minelayer in minelayers) 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);
} }
} }

View File

@@ -88,9 +88,9 @@ namespace OpenRA.Mods.Cnc.Traits
self.World.OrderGenerator = new PortableChronoOrderGenerator(self, Info); self.World.OrderGenerator = new PortableChronoOrderGenerator(self, Info);
if (order.OrderID == "PortableChronoTeleport") 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) public void ResolveOrder(Actor self, Order order)
@@ -185,7 +185,7 @@ namespace OpenRA.Mods.Cnc.Traits
&& self.Trait<PortableChrono>().CanTeleport && self.Owner.Shroud.IsExplored(cell)) && self.Trait<PortableChrono>().CanTeleport && self.Owner.Shroud.IsExplored(cell))
{ {
world.CancelInputMode(); 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));
} }
} }

View File

@@ -97,9 +97,8 @@ namespace OpenRA.Mods.Cnc.Traits
{ {
world.CancelInputMode(); world.CancelInputMode();
if (mi.Button == expectedButton && IsValidTarget(world, cell)) 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 SuppressVisualFeedback = true
}; };
} }

View File

@@ -221,9 +221,8 @@ namespace OpenRA.Mods.Cnc.Traits
{ {
// Cannot chronoshift into unexplored location // Cannot chronoshift into unexplored location
if (IsValidTarget(xy)) 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, ExtraLocation = sourceLocation,
SuppressVisualFeedback = true SuppressVisualFeedback = true
}; };

View File

@@ -157,11 +157,13 @@ namespace OpenRA.Mods.Common.AI
else else
{ {
failCount = 0; 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, TargetString = currentBuilding.Item,
TargetActor = queue.Actor,
// Actor ID to associate the placement with
ExtraData = queue.Actor.ActorID,
SuppressVisualFeedback = true SuppressVisualFeedback = true
}); });

View File

@@ -757,7 +757,7 @@ namespace OpenRA.Mods.Common.AI
if (target.Actor == null) if (target.Actor == null)
return; 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); BotDebug("AI ({0}): Ordered {1} to capture {2}", Player.ClientIndex, capturer, target.Actor);
activeUnits.Remove(capturer); activeUnits.Remove(capturer);
} }
@@ -813,7 +813,7 @@ namespace OpenRA.Mods.Common.AI
// Tell the idle harvester to quit slacking: // Tell the idle harvester to quit slacking:
var newSafeResourcePatch = FindNextResource(harvester, harv); var newSafeResourcePatch = FindNextResource(harvester, harv);
BotDebug("AI: Harvester {0} is idle. Ordering to {1} in search for new resources.".F(harvester, newSafeResourcePatch)); 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,14 +927,17 @@ namespace OpenRA.Mods.Common.AI
void SetRallyPointsForNewProductionBuildings(Actor self) void SetRallyPointsForNewProductionBuildings(Actor self)
{ {
foreach (var rp in self.World.ActorsWithTrait<RallyPoint>()) foreach (var rp in self.World.ActorsWithTrait<RallyPoint>())
{
if (rp.Actor.Owner == Player && if (rp.Actor.Owner == Player &&
!IsRallyPointValid(rp.Trait.Location, rp.Actor.Info.TraitInfoOrDefault<BuildingInfo>())) !IsRallyPointValid(rp.Trait.Location, rp.Actor.Info.TraitInfoOrDefault<BuildingInfo>()))
QueueOrder(new Order("SetRallyPoint", rp.Actor, false)
{ {
TargetLocation = ChooseRallyLocationNear(rp.Actor), QueueOrder(new Order("SetRallyPoint", rp.Actor, Target.FromCell(World, ChooseRallyLocationNear(rp.Actor)), false)
{
SuppressVisualFeedback = true SuppressVisualFeedback = true
}); });
} }
}
}
// Won't work for shipyards... // Won't work for shipyards...
CPos ChooseRallyLocationNear(Actor producer) CPos ChooseRallyLocationNear(Actor producer)
@@ -992,7 +995,7 @@ namespace OpenRA.Mods.Common.AI
if (desiredLocation == null) if (desiredLocation == null)
continue; 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)); 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 // 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); BotDebug("AI: {2} found new target location {0} for support power {1}.", attackLocation, sp.Info.OrderName, Player.PlayerName);
waitingPowers[sp] += 10; 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.", BotDebug("Bot noticed damage {0} {1}->{2}, repairing.",
self, e.PreviousDamageState, e.DamageState); 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));
} }
} }

View File

@@ -223,7 +223,7 @@ namespace OpenRA.Mods.Common.AI
} }
if (CanAttackTarget(a, owner.TargetActor)) 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; 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); owner.FuzzyStateMachine.ChangeState(owner, new AirIdleState(), true);

View File

@@ -54,7 +54,7 @@ namespace OpenRA.Mods.Common.AI
if (AttackOrFleeFuzzy.Default.CanAttack(owner.Units, enemyUnits)) if (AttackOrFleeFuzzy.Default.CanAttack(owner.Units, enemyUnits))
{ {
foreach (var u in owner.Units) 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. // We have gathered sufficient units. Attack the nearest enemy unit.
owner.FuzzyStateMachine.ChangeState(owner, new GroundUnitsAttackMoveState(), true); owner.FuzzyStateMachine.ChangeState(owner, new GroundUnitsAttackMoveState(), true);
@@ -100,7 +100,7 @@ namespace OpenRA.Mods.Common.AI
// Let them regroup into tighter formation. // Let them regroup into tighter formation.
owner.Bot.QueueOrder(new Order("Stop", leader, false)); owner.Bot.QueueOrder(new Order("Stop", leader, false));
foreach (var unit in owner.Units.Where(a => !ownUnits.Contains(a))) 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 else
{ {
@@ -114,7 +114,7 @@ namespace OpenRA.Mods.Common.AI
} }
else else
foreach (var a in owner.Units) 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)) if (ShouldFlee(owner))
@@ -147,7 +147,7 @@ namespace OpenRA.Mods.Common.AI
foreach (var a in owner.Units) foreach (var a in owner.Units)
if (!BusyAttack(a)) 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)) if (ShouldFlee(owner))
owner.FuzzyStateMachine.ChangeState(owner, new GroundUnitsFleeState(), true); owner.FuzzyStateMachine.ChangeState(owner, new GroundUnitsFleeState(), true);

View File

@@ -81,7 +81,7 @@ namespace OpenRA.Mods.Common.AI
if (AttackOrFleeFuzzy.Default.CanAttack(owner.Units, enemyUnits)) if (AttackOrFleeFuzzy.Default.CanAttack(owner.Units, enemyUnits))
{ {
foreach (var u in owner.Units) 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. // We have gathered sufficient units. Attack the nearest enemy unit.
owner.FuzzyStateMachine.ChangeState(owner, new NavyUnitsAttackMoveState(), true); owner.FuzzyStateMachine.ChangeState(owner, new NavyUnitsAttackMoveState(), true);
@@ -127,7 +127,7 @@ namespace OpenRA.Mods.Common.AI
// Let them regroup into tighter formation. // Let them regroup into tighter formation.
owner.Bot.QueueOrder(new Order("Stop", leader, false)); owner.Bot.QueueOrder(new Order("Stop", leader, false));
foreach (var unit in owner.Units.Where(a => !ownUnits.Contains(a))) 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 else
{ {
@@ -141,7 +141,7 @@ namespace OpenRA.Mods.Common.AI
} }
else else
foreach (var a in owner.Units) 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)) if (ShouldFlee(owner))
@@ -174,7 +174,7 @@ namespace OpenRA.Mods.Common.AI
foreach (var a in owner.Units) foreach (var a in owner.Units)
if (!BusyAttack(a)) 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)) if (ShouldFlee(owner))
owner.FuzzyStateMachine.ChangeState(owner, new NavyUnitsFleeState(), true); owner.FuzzyStateMachine.ChangeState(owner, new NavyUnitsFleeState(), true);

View File

@@ -9,6 +9,8 @@
*/ */
#endregion #endregion
using OpenRA.Traits;
namespace OpenRA.Mods.Common.AI namespace OpenRA.Mods.Common.AI
{ {
class UnitsForProtectionIdleState : GroundStateBase, IState class UnitsForProtectionIdleState : GroundStateBase, IState
@@ -55,7 +57,7 @@ namespace OpenRA.Mods.Common.AI
else else
{ {
foreach (var a in owner.Units) 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));
} }
} }

View File

@@ -26,7 +26,7 @@ namespace OpenRA.Mods.Common.AI
{ {
var loc = RandomBuildingLocation(squad); var loc = RandomBuildingLocation(squad);
foreach (var a in squad.Units) 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) protected static CPos RandomBuildingLocation(Squad squad)

View File

@@ -11,6 +11,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using OpenRA.Graphics; using OpenRA.Graphics;
using OpenRA.Traits;
namespace OpenRA.Mods.Common.Orders namespace OpenRA.Mods.Common.Orders
{ {
@@ -21,7 +22,7 @@ namespace OpenRA.Mods.Common.Orders
world.CancelInputMode(); world.CancelInputMode();
if (mi.Button == MouseButton.Left) 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) { } public virtual void Tick(World world) { }

View File

@@ -13,6 +13,7 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using OpenRA.Mods.Common.Traits; using OpenRA.Mods.Common.Traits;
using OpenRA.Orders; using OpenRA.Orders;
using OpenRA.Traits;
namespace OpenRA.Mods.Common.Orders namespace OpenRA.Mods.Common.Orders
{ {
@@ -35,7 +36,7 @@ namespace OpenRA.Mods.Common.Orders
var queued = mi.Modifiers.HasModifier(Modifiers.Shift); var queued = mi.Modifiers.HasModifier(Modifiers.Shift);
foreach (var subject in Subjects) foreach (var subject in Subjects)
if (subject != target) 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) public override void Tick(World world)

View File

@@ -133,11 +133,13 @@ namespace OpenRA.Mods.Common.Orders
orderType = "LineBuild"; orderType = "LineBuild";
} }
yield return new Order(orderType, owner.PlayerActor, false) yield return new Order(orderType, owner.PlayerActor, Target.FromCell(world, topLeft), false)
{ {
TargetLocation = topLeft, // Building to place
TargetActor = queue.Actor,
TargetString = building, TargetString = building,
// Actor to associate the placement with
ExtraData = queue.Actor.ActorID,
SuppressVisualFeedback = true SuppressVisualFeedback = true
}; };
} }
@@ -267,9 +269,8 @@ namespace OpenRA.Mods.Common.Orders
if (availableCells.Count == 0) if (availableCells.Count == 0)
continue; 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 SuppressVisualFeedback = true
}; };
} }

View File

@@ -43,7 +43,7 @@ namespace OpenRA.Mods.Common.Orders
// Repair a building. // Repair a building.
if (underCursor.Info.HasTraitInfo<RepairableBuildingInfo>()) if (underCursor.Info.HasTraitInfo<RepairableBuildingInfo>())
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 // Don't command allied units
if (underCursor.Owner != world.LocalPlayer) if (underCursor.Owner != world.LocalPlayer)
@@ -69,7 +69,7 @@ namespace OpenRA.Mods.Common.Orders
if (repairBuilding == null) if (repairBuilding == null)
yield break; 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) public void Tick(World world)

View File

@@ -655,11 +655,8 @@ namespace OpenRA.Mods.Common.Traits
public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued) public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued)
{ {
if (order.OrderID == "Enter") if (order.OrderID == "Enter" || order.OrderID == "Move")
return new Order(order.OrderID, self, queued) { TargetActor = target.Actor }; return new Order(order.OrderID, self, target, queued);
if (order.OrderID == "Move")
return new Order(order.OrderID, self, queued) { TargetLocation = self.World.Map.CellContaining(target.CenterPosition) };
return null; return null;
} }

View File

@@ -132,17 +132,7 @@ namespace OpenRA.Mods.Common.Traits
Order IIssueOrder.IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued) Order IIssueOrder.IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued)
{ {
if (order is AttackOrderTargeter) if (order is AttackOrderTargeter)
{ return new Order(order.OrderID, self, target, queued);
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 null; return null;
} }

View File

@@ -50,10 +50,7 @@ namespace OpenRA.Mods.Common.Traits
if (order.OrderID != "DetonateAttack" && order.OrderID != "Detonate") if (order.OrderID != "DetonateAttack" && order.OrderID != "Detonate")
return null; return null;
if (target.Type == TargetType.FrozenActor) return new Order(order.OrderID, self, target, queued);
return new Order(order.OrderID, self, queued) { ExtraData = target.FrozenActor.ID };
return new Order(order.OrderID, self, queued) { TargetActor = target.Actor };
} }
Order IIssueDeployOrder.IssueDeployOrder(Actor self) Order IIssueDeployOrder.IssueDeployOrder(Actor self)

View File

@@ -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 // Cells outside the playable area should be clamped to the edge for consistency with move orders
cell = world.Map.Clamp(cell); cell = world.Map.Clamp(cell);
foreach (var s in subjects) 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);
} }
} }

View File

@@ -32,7 +32,7 @@ namespace OpenRA.Mods.Common.Traits
public override void DoAction(Actor self, CPos targetCell) 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));
} }
} }
} }

View File

@@ -77,7 +77,7 @@ namespace OpenRA.Mods.Common.Traits
public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued) public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued)
{ {
if (order.OrderID == OrderID) 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 }; ExtraData = ((RallyPointOrderTargeter)order).ForceSet ? ForceSet : 0 };
return null; return null;

View File

@@ -65,10 +65,7 @@ namespace OpenRA.Mods.Common.Traits
if (order.OrderID != "CaptureActor") if (order.OrderID != "CaptureActor")
return null; return null;
if (target.Type == TargetType.FrozenActor) return new Order(order.OrderID, self, target, queued);
return new Order(order.OrderID, self, queued) { ExtraData = target.FrozenActor.ID };
return new Order(order.OrderID, self, queued) { TargetActor = target.Actor };
} }
public string VoicePhraseForOrder(Actor self, Order order) public string VoicePhraseForOrder(Actor self, Order order)

View File

@@ -205,21 +205,8 @@ namespace OpenRA.Mods.Common.Traits
Order IIssueOrder.IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued) Order IIssueOrder.IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued)
{ {
if (order.OrderID == "PickupUnit") if (order.OrderID == "PickupUnit" || order.OrderID == "DeliverUnit" || order.OrderID == "Unload")
{ return new Order(order.OrderID, self, target, queued);
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) };
}
return null; return null;
} }

View File

@@ -57,10 +57,7 @@ namespace OpenRA.Mods.Common.Traits
if (order.OrderID != "DeliverCash") if (order.OrderID != "DeliverCash")
return null; return null;
if (target.Type == TargetType.FrozenActor) return new Order(order.OrderID, self, target, queued);
return new Order(order.OrderID, self, queued) { ExtraData = target.FrozenActor.ID };
return new Order(order.OrderID, self, queued) { TargetActor = target.Actor };
} }
public string VoicePhraseForOrder(Actor self, Order order) public string VoicePhraseForOrder(Actor self, Order order)

View File

@@ -58,10 +58,7 @@ namespace OpenRA.Mods.Common.Traits
if (order.OrderID != "DeliverExperience") if (order.OrderID != "DeliverExperience")
return null; return null;
if (target.Type == TargetType.FrozenActor) return new Order(order.OrderID, self, target, queued);
return new Order(order.OrderID, self, queued) { ExtraData = target.FrozenActor.ID };
return new Order(order.OrderID, self, queued) { TargetActor = target.Actor };
} }
public string VoicePhraseForOrder(Actor self, Order order) public string VoicePhraseForOrder(Actor self, Order order)

View File

@@ -67,10 +67,7 @@ namespace OpenRA.Mods.Common.Traits
if (order.OrderID != "C4") if (order.OrderID != "C4")
return null; return null;
if (target.Type == TargetType.FrozenActor) return new Order(order.OrderID, self, target, queued);
return new Order(order.OrderID, self, queued) { ExtraData = target.FrozenActor.ID };
return new Order(order.OrderID, self, queued) { TargetActor = target.Actor };
} }
public void ResolveOrder(Actor self, Order order) public void ResolveOrder(Actor self, Order order)

View File

@@ -51,10 +51,7 @@ namespace OpenRA.Mods.Common.Traits
if (order.OrderID != "EngineerRepair") if (order.OrderID != "EngineerRepair")
return null; return null;
if (target.Type == TargetType.FrozenActor) return new Order(order.OrderID, self, target, queued);
return new Order(order.OrderID, self, queued) { ExtraData = target.FrozenActor.ID };
return new Order(order.OrderID, self, queued) { TargetActor = target.Actor };
} }
static bool IsValidOrder(Actor self, Order order) static bool IsValidOrder(Actor self, Order order)

View File

@@ -52,10 +52,7 @@ namespace OpenRA.Mods.Common.Traits
if (order.OrderID != "EnterTunnel") if (order.OrderID != "EnterTunnel")
return null; return null;
if (target.Type == TargetType.FrozenActor) return new Order(order.OrderID, self, target, queued) { SuppressVisualFeedback = true };
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 };
} }
public string VoicePhraseForOrder(Actor self, Order order) public string VoicePhraseForOrder(Actor self, Order order)

View File

@@ -66,10 +66,7 @@ namespace OpenRA.Mods.Common.Traits
if (order.OrderID != "ExternalCaptureActor") if (order.OrderID != "ExternalCaptureActor")
return null; return null;
if (target.Type == TargetType.FrozenActor) return new Order(order.OrderID, self, target, queued);
return new Order(order.OrderID, self, queued) { ExtraData = target.FrozenActor.ID };
return new Order(order.OrderID, self, queued) { TargetActor = target.Actor };
} }
static bool IsValidOrder(Actor self, Order order) static bool IsValidOrder(Actor self, Order order)

View File

@@ -342,11 +342,8 @@ namespace OpenRA.Mods.Common.Traits
public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued) public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued)
{ {
if (order.OrderID == "Deliver") if (order.OrderID == "Deliver" || order.OrderID == "Harvest")
return new Order(order.OrderID, self, queued) { TargetActor = target.Actor }; return new Order(order.OrderID, self, target, queued);
if (order.OrderID == "Harvest")
return new Order(order.OrderID, self, queued) { TargetLocation = self.World.Map.CellContaining(target.CenterPosition) };
return null; return null;
} }

View File

@@ -585,7 +585,7 @@ namespace OpenRA.Mods.Common.Traits
public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued) public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued)
{ {
if (order is MoveOrderTargeter) 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; return null;
} }

View File

@@ -66,7 +66,7 @@ namespace OpenRA.Mods.Common.Traits
public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued) public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued)
{ {
if (order.OrderID == "EnterTransport" || order.OrderID == "EnterTransports") 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; return null;
} }

View File

@@ -56,12 +56,13 @@ namespace OpenRA.Mods.Common.Traits
self.World.AddFrameEndTask(w => self.World.AddFrameEndTask(w =>
{ {
var prevItems = GetNumBuildables(self.Owner); var prevItems = GetNumBuildables(self.Owner);
var targetActor = w.GetActorById(order.ExtraData);
if (order.TargetActor.IsDead) if (targetActor.IsDead)
return; return;
var unit = self.World.Map.Rules.Actors[order.TargetString]; var unit = self.World.Map.Rules.Actors[order.TargetString];
var queue = order.TargetActor.TraitsImplementing<ProductionQueue>() var queue = targetActor.TraitsImplementing<ProductionQueue>()
.FirstOrDefault(q => q.CanBuild(unit) && q.CurrentItem() != null && q.CurrentItem().Item == order.TargetString && q.CurrentItem().RemainingTime == 0); .FirstOrDefault(q => q.CanBuild(unit) && q.CurrentItem() != null && q.CurrentItem().Item == order.TargetString && q.CurrentItem().RemainingTime == 0);
if (queue == null) if (queue == null)

View File

@@ -55,7 +55,7 @@ namespace OpenRA.Mods.Common.Traits
public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued) public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued)
{ {
if (order.OrderID == "Repair") if (order.OrderID == "Repair")
return new Order(order.OrderID, self, queued) { TargetActor = target.Actor }; return new Order(order.OrderID, self, target, queued);
return null; return null;
} }

View File

@@ -52,7 +52,7 @@ namespace OpenRA.Mods.Common.Traits
public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued) public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued)
{ {
if (order.OrderID == "RepairNear") if (order.OrderID == "RepairNear")
return new Order(order.OrderID, self, queued) { TargetActor = target.Actor }; return new Order(order.OrderID, self, target, queued);
return null; return null;
} }

View File

@@ -55,7 +55,7 @@ namespace OpenRA.Mods.Common.Traits
public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued) public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued)
{ {
if (order.OrderID == "RepairBridge") if (order.OrderID == "RepairBridge")
return new Order(order.OrderID, self, queued) { TargetActor = target.Actor }; return new Order(order.OrderID, self, target, queued);
return null; return null;
} }

View File

@@ -120,7 +120,7 @@ namespace OpenRA.Mods.Common.Traits
{ {
world.CancelInputMode(); world.CancelInputMode();
if (mi.Button == MouseButton.Left && power.UnitsInRange(cell).Any()) 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) public void Tick(World world)

View File

@@ -280,7 +280,7 @@ namespace OpenRA.Mods.Common.Traits
{ {
world.CancelInputMode(); world.CancelInputMode();
if (mi.Button == expectedButton && world.Map.Contains(cell)) 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) public virtual void Tick(World world)

View File

@@ -115,7 +115,7 @@ namespace OpenRA.Mods.Common.Traits
public virtual void DoAction(Actor self, CPos targetCell) 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));
} }
} }
} }

View File

@@ -11,6 +11,7 @@
using System.IO; using System.IO;
using NUnit.Framework; using NUnit.Framework;
using OpenRA.Traits;
namespace OpenRA.Test namespace OpenRA.Test
{ {
@@ -18,6 +19,7 @@ namespace OpenRA.Test
public class OrderTest public class OrderTest
{ {
Order order; Order order;
Order targetInvalid;
Order immediateOrder; Order immediateOrder;
[SetUp] [SetUp]
@@ -26,11 +28,12 @@ namespace OpenRA.Test
order = new Order("TestOrder", null, false) order = new Order("TestOrder", null, false)
{ {
TargetString = "TestTarget", TargetString = "TestTarget",
TargetLocation = new CPos(1234, 5678),
ExtraData = 1234, ExtraData = 1234,
ExtraLocation = new CPos(555, 555) ExtraLocation = new CPos(555, 555)
}; };
targetInvalid = new Order("TestOrder", null, Target.Invalid, false);
immediateOrder = new Order("TestOrderImmediate", null, false) immediateOrder = new Order("TestOrderImmediate", null, false)
{ {
IsImmediate = true, 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")] [TestCase(TestName = "Data persists over serialization")]
public void SerializeA() public void SerializeA()
{ {
var serializedData = new MemoryStream(order.Serialize()); Assert.That(RoundTripOrder(order).ToString(), Is.EqualTo(order.ToString()));
var result = Order.Deserialize(null, new BinaryReader(serializedData));
Assert.That(result.ToString(), Is.EqualTo(order.ToString()));
} }
[TestCase(TestName = "Data persists over serialization immediate")] [TestCase(TestName = "Data persists over serialization (Immediate order)")]
public void SerializeB() public void SerializeB()
{ {
var serializedData = new MemoryStream(immediateOrder.Serialize()); Assert.That(RoundTripOrder(immediateOrder).ToString(), Is.EqualTo(immediateOrder.ToString()));
var result = Order.Deserialize(null, new BinaryReader(serializedData)); }
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()));
} }
} }
} }