Remove TargetActor and TargetLocation from order issuing.
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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<PortableChrono>().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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
@@ -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
|
||||
});
|
||||
|
||||
|
||||
@@ -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<RallyPoint>())
|
||||
{
|
||||
if (rp.Actor.Owner == Player &&
|
||||
!IsRallyPointValid(rp.Trait.Location, rp.Actor.Info.TraitInfoOrDefault<BuildingInfo>()))
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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) { }
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
};
|
||||
}
|
||||
|
||||
@@ -43,7 +43,7 @@ namespace OpenRA.Mods.Common.Orders
|
||||
|
||||
// Repair a building.
|
||||
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
|
||||
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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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<ProductionQueue>()
|
||||
var queue = targetActor.TraitsImplementing<ProductionQueue>()
|
||||
.FirstOrDefault(q => q.CanBuild(unit) && q.CurrentItem() != null && q.CurrentItem().Item == order.TargetString && q.CurrentItem().RemainingTime == 0);
|
||||
|
||||
if (queue == null)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user