Expose targetline colors to yaml.

All targetlines can now be set to a custom color in yaml or set to be invisible.
All automated behaviours including scripted activities now have no visible target lines.
This commit is contained in:
tovl
2020-08-02 22:22:39 +02:00
committed by Paul Chote
parent ea3c7a3c34
commit 84eb3c54ef
41 changed files with 139 additions and 58 deletions

View File

@@ -507,7 +507,10 @@ namespace OpenRA.Traits
bool AlwaysEnabled { get; } bool AlwaysEnabled { get; }
} }
public interface IMoveInfo : ITraitInfoInterface { } public interface IMoveInfo : ITraitInfoInterface
{
Color GetTargetLineColor();
}
[RequireExplicitImplementation] [RequireExplicitImplementation]
public interface IGameOver { void GameOver(World world); } public interface IGameOver { void GameOver(World world); }

View File

@@ -24,8 +24,8 @@ namespace OpenRA.Mods.Cnc.Activities
readonly INotifyInfiltration[] notifiers; readonly INotifyInfiltration[] notifiers;
Actor enterActor; Actor enterActor;
public Infiltrate(Actor self, in Target target, Infiltrates infiltrates) public Infiltrate(Actor self, in Target target, Infiltrates infiltrates, Color? targetLineColor)
: base(self, target, Color.Crimson) : base(self, target, targetLineColor)
{ {
this.infiltrates = infiltrates; this.infiltrates = infiltrates;
notifiers = self.TraitsImplementing<INotifyInfiltration>().ToArray(); notifiers = self.TraitsImplementing<INotifyInfiltration>().ToArray();

View File

@@ -26,6 +26,7 @@ namespace OpenRA.Mods.Cnc.Activities
readonly Minelayer minelayer; readonly Minelayer minelayer;
readonly AmmoPool[] ammoPools; readonly AmmoPool[] ammoPools;
readonly IMove movement; readonly IMove movement;
readonly IMoveInfo moveInfo;
readonly RearmableInfo rearmableInfo; readonly RearmableInfo rearmableInfo;
List<CPos> minefield; List<CPos> minefield;
@@ -37,6 +38,7 @@ namespace OpenRA.Mods.Cnc.Activities
minelayer = self.Trait<Minelayer>(); minelayer = self.Trait<Minelayer>();
ammoPools = self.TraitsImplementing<AmmoPool>().ToArray(); ammoPools = self.TraitsImplementing<AmmoPool>().ToArray();
movement = self.Trait<IMove>(); movement = self.Trait<IMove>();
moveInfo = self.Info.TraitInfo<IMoveInfo>();
rearmableInfo = self.Info.TraitInfoOrDefault<RearmableInfo>(); rearmableInfo = self.Info.TraitInfoOrDefault<RearmableInfo>();
this.minefield = minefield; this.minefield = minefield;
} }
@@ -118,17 +120,17 @@ namespace OpenRA.Mods.Cnc.Activities
public override IEnumerable<TargetLineNode> TargetLineNodes(Actor self) public override IEnumerable<TargetLineNode> TargetLineNodes(Actor self)
{ {
if (returnToBase) if (returnToBase)
yield return new TargetLineNode(Target.FromActor(rearmTarget), Color.Green); yield return new TargetLineNode(Target.FromActor(rearmTarget), moveInfo.GetTargetLineColor());
if (minefield == null || minefield.Count == 0) if (minefield == null || minefield.Count == 0)
yield break; yield break;
var nextCell = NextValidCell(self); var nextCell = NextValidCell(self);
if (nextCell != null) if (nextCell != null)
yield return new TargetLineNode(Target.FromCell(self.World, nextCell.Value), Color.Crimson); yield return new TargetLineNode(Target.FromCell(self.World, nextCell.Value), minelayer.Info.TargetLineColor);
foreach (var c in minefield) foreach (var c in minefield)
yield return new TargetLineNode(Target.FromCell(self.World, c), Color.Crimson, tile: minelayer.Tile); yield return new TargetLineNode(Target.FromCell(self.World, c), minelayer.Info.TargetLineColor, tile: minelayer.Tile);
} }
static bool CanLayMine(Actor self, CPos p) static bool CanLayMine(Actor self, CPos p)

View File

@@ -37,7 +37,8 @@ namespace OpenRA.Mods.Cnc.Scripting
if (infiltrates == null) if (infiltrates == null)
throw new LuaException("{0} tried to infiltrate invalid target {1}!".F(Self, target)); throw new LuaException("{0} tried to infiltrate invalid target {1}!".F(Self, target));
Self.QueueActivity(new Infiltrate(Self, Target.FromActor(target), infiltrates)); // NB: Scripted actions get no visible targetlines.
Self.QueueActivity(new Infiltrate(Self, Target.FromActor(target), infiltrates, null));
} }
} }
} }

View File

@@ -27,6 +27,9 @@ namespace OpenRA.Mods.Cnc.Traits
[VoiceReference] [VoiceReference]
public readonly string Voice = "Action"; public readonly string Voice = "Action";
[Desc("Color to use for the target line.")]
public readonly Color TargetLineColor = Color.Crimson;
[Desc("What diplomatic stances can be infiltrated by this actor.")] [Desc("What diplomatic stances can be infiltrated by this actor.")]
public readonly PlayerRelationship ValidStances = PlayerRelationship.Neutral | PlayerRelationship.Enemy; public readonly PlayerRelationship ValidStances = PlayerRelationship.Neutral | PlayerRelationship.Enemy;
@@ -115,7 +118,7 @@ namespace OpenRA.Mods.Cnc.Traits
if (!CanInfiltrateTarget(self, order.Target)) if (!CanInfiltrateTarget(self, order.Target))
return; return;
self.QueueActivity(order.Queued, new Infiltrate(self, order.Target, this)); self.QueueActivity(order.Queued, new Infiltrate(self, order.Target, this, Info.TargetLineColor));
self.ShowTargetLines(); self.ShowTargetLines();
} }
} }

View File

@@ -17,6 +17,7 @@ using OpenRA.Graphics;
using OpenRA.Mods.Cnc.Activities; using OpenRA.Mods.Cnc.Activities;
using OpenRA.Mods.Common.Orders; using OpenRA.Mods.Common.Orders;
using OpenRA.Mods.Common.Traits; using OpenRA.Mods.Common.Traits;
using OpenRA.Primitives;
using OpenRA.Traits; using OpenRA.Traits;
namespace OpenRA.Mods.Cnc.Traits namespace OpenRA.Mods.Cnc.Traits
@@ -34,6 +35,9 @@ namespace OpenRA.Mods.Cnc.Traits
[Desc("Voice to use when ordered to lay a minefield.")] [Desc("Voice to use when ordered to lay a minefield.")]
public readonly string Voice = "Action"; public readonly string Voice = "Action";
[Desc("Color to use for the target line when laying mines.")]
public readonly Color TargetLineColor = Color.Crimson;
[Desc("Sprite overlay to use for valid minefield cells.")] [Desc("Sprite overlay to use for valid minefield cells.")]
public readonly string TileValidName = "build-valid"; public readonly string TileValidName = "build-valid";

View File

@@ -68,6 +68,9 @@ namespace OpenRA.Mods.Cnc.Traits
[Desc("Range circle border width.")] [Desc("Range circle border width.")]
public readonly float CircleBorderWidth = 3; public readonly float CircleBorderWidth = 3;
[Desc("Color to use for the target line.")]
public readonly Color TargetLineColor = Color.LawnGreen;
public override object Create(ActorInitializer init) { return new PortableChrono(init.Self, this); } public override object Create(ActorInitializer init) { return new PortableChrono(init.Self, this); }
} }
@@ -128,10 +131,10 @@ namespace OpenRA.Mods.Cnc.Traits
var cell = self.World.Map.CellContaining(order.Target.CenterPosition); var cell = self.World.Map.CellContaining(order.Target.CenterPosition);
if (maxDistance != null) if (maxDistance != null)
self.QueueActivity(move.MoveWithinRange(order.Target, WDist.FromCells(maxDistance.Value), targetLineColor: Color.LawnGreen)); self.QueueActivity(move.MoveWithinRange(order.Target, WDist.FromCells(maxDistance.Value), targetLineColor: Info.TargetLineColor));
self.QueueActivity(new Teleport(self, cell, maxDistance, Info.KillCargo, Info.FlashScreen, Info.ChronoshiftSound)); self.QueueActivity(new Teleport(self, cell, maxDistance, Info.KillCargo, Info.FlashScreen, Info.ChronoshiftSound));
self.QueueActivity(move.MoveTo(cell, 5, targetLineColor: Color.LawnGreen)); self.QueueActivity(move.MoveTo(cell, 5, targetLineColor: Info.TargetLineColor));
self.ShowTargetLines(); self.ShowTargetLines();
} }
} }

View File

@@ -32,6 +32,7 @@ namespace OpenRA.Mods.Cnc.Traits
public override object Create(ActorInitializer init) { return new TDGunboat(init, this); } public override object Create(ActorInitializer init) { return new TDGunboat(init, this); }
public WAngle GetInitialFacing() { return InitialFacing; } public WAngle GetInitialFacing() { return InitialFacing; }
public Color GetTargetLineColor() { return Color.Green; }
IEnumerable<ActorInit> IActorPreviewInitInfo.ActorPreviewInits(ActorInfo ai, ActorPreviewType type) IEnumerable<ActorInit> IActorPreviewInitInfo.ActorPreviewInits(ActorInfo ai, ActorPreviewType type)
{ {

View File

@@ -131,7 +131,7 @@ namespace OpenRA.Mods.Common.Activities
public override IEnumerable<TargetLineNode> TargetLineNodes(Actor self) public override IEnumerable<TargetLineNode> TargetLineNodes(Actor self)
{ {
if (ChildActivity == null) if (ChildActivity == null)
yield return new TargetLineNode(Target.FromActor(dest), Color.Green); yield return new TargetLineNode(Target.FromActor(dest), aircraft.Info.TargetLineColor);
else else
foreach (var n in ChildActivity.TargetLineNodes(self)) foreach (var n in ChildActivity.TargetLineNodes(self))
yield return n; yield return n;

View File

@@ -22,8 +22,8 @@ namespace OpenRA.Mods.Common.Activities
Actor enterActor; Actor enterActor;
CaptureManager enterCaptureManager; CaptureManager enterCaptureManager;
public CaptureActor(Actor self, in Target target) public CaptureActor(Actor self, in Target target, Color? targetLineColor)
: base(self, target, Color.Crimson) : base(self, target, targetLineColor)
{ {
manager = self.Trait<CaptureManager>(); manager = self.Trait<CaptureManager>();
} }

View File

@@ -85,9 +85,9 @@ namespace OpenRA.Mods.Common.Activities
public override IEnumerable<TargetLineNode> TargetLineNodes(Actor self) public override IEnumerable<TargetLineNode> TargetLineNodes(Actor self)
{ {
if (proc != null) if (proc != null)
yield return new TargetLineNode(Target.FromActor(proc), Color.Green); yield return new TargetLineNode(Target.FromActor(proc), harv.Info.DeliverLineColor);
else else
yield return new TargetLineNode(Target.FromActor(harv.LinkedProc), Color.Green); yield return new TargetLineNode(Target.FromActor(harv.LinkedProc), harv.Info.DeliverLineColor);
} }
} }
} }

View File

@@ -60,7 +60,7 @@ namespace OpenRA.Mods.Common.Activities
public override IEnumerable<TargetLineNode> TargetLineNodes(Actor self) public override IEnumerable<TargetLineNode> TargetLineNodes(Actor self)
{ {
yield return new TargetLineNode(destination, Color.Yellow); yield return new TargetLineNode(destination, carryall.Info.TargetLineColor);
} }
class ReleaseUnit : Activity class ReleaseUnit : Activity

View File

@@ -30,9 +30,9 @@ namespace OpenRA.Mods.Common.Activities
Actor enterActor; Actor enterActor;
IDemolishable[] enterDemolishables; IDemolishable[] enterDemolishables;
public Demolish(Actor self, in Target target, EnterBehaviour enterBehaviour, int delay, public Demolish(Actor self, in Target target, EnterBehaviour enterBehaviour, int delay, int flashes,
int flashes, int flashesDelay, int flashInterval, BitSet<DamageType> damageTypes) int flashesDelay, int flashInterval, BitSet<DamageType> damageTypes, Color? targetLineColor)
: base(self, target, Color.Crimson) : base(self, target, targetLineColor)
{ {
notifiers = self.TraitsImplementing<INotifyDemolition>().ToArray(); notifiers = self.TraitsImplementing<INotifyDemolition>().ToArray();
this.delay = delay; this.delay = delay;

View File

@@ -21,8 +21,8 @@ namespace OpenRA.Mods.Common.Activities
readonly int payload; readonly int payload;
readonly int playerExperience; readonly int playerExperience;
public DonateCash(Actor self, in Target target, int payload, int playerExperience) public DonateCash(Actor self, in Target target, int payload, int playerExperience, Color? targetLineColor)
: base(self, target, Color.Yellow) : base(self, target, targetLineColor)
{ {
this.payload = payload; this.payload = payload;
this.playerExperience = playerExperience; this.playerExperience = playerExperience;

View File

@@ -23,8 +23,8 @@ namespace OpenRA.Mods.Common.Activities
Actor enterActor; Actor enterActor;
GainsExperience enterGainsExperience; GainsExperience enterGainsExperience;
public DonateExperience(Actor self, in Target target, int level, int playerExperience) public DonateExperience(Actor self, in Target target, int level, int playerExperience, Color? targetLineColor)
: base(self, target, Color.Yellow) : base(self, target, targetLineColor)
{ {
this.level = level; this.level = level;
this.playerExperience = playerExperience; this.playerExperience = playerExperience;

View File

@@ -243,9 +243,9 @@ namespace OpenRA.Mods.Common.Activities
yield return n; yield return n;
if (orderLocation != null) if (orderLocation != null)
yield return new TargetLineNode(Target.FromCell(self.World, orderLocation.Value), Color.Crimson); yield return new TargetLineNode(Target.FromCell(self.World, orderLocation.Value), harvInfo.HarvestLineColor);
else if (deliverActor != null) else if (deliverActor != null)
yield return new TargetLineNode(Target.FromActor(deliverActor), Color.Green); yield return new TargetLineNode(Target.FromActor(deliverActor), harvInfo.DeliverLineColor);
} }
CPos? GetSearchFromProcLocation(Actor self) CPos? GetSearchFromProcLocation(Actor self)

View File

@@ -109,7 +109,7 @@ namespace OpenRA.Mods.Common.Activities
public override IEnumerable<TargetLineNode> TargetLineNodes(Actor self) public override IEnumerable<TargetLineNode> TargetLineNodes(Actor self)
{ {
yield return new TargetLineNode(Target.FromCell(self.World, targetCell), Color.Crimson); yield return new TargetLineNode(Target.FromCell(self.World, targetCell), harvInfo.HarvestLineColor);
} }
} }
} }

View File

@@ -116,7 +116,7 @@ namespace OpenRA.Mods.Common.Activities
public override IEnumerable<TargetLineNode> TargetLineNodes(Actor self) public override IEnumerable<TargetLineNode> TargetLineNodes(Actor self)
{ {
yield return new TargetLineNode(Target.FromActor(cargo), Color.Yellow); yield return new TargetLineNode(Target.FromActor(cargo), carryall.Info.TargetLineColor);
} }
class AttachUnit : Activity class AttachUnit : Activity

View File

@@ -24,8 +24,8 @@ namespace OpenRA.Mods.Common.Activities
BridgeHut enterHut; BridgeHut enterHut;
LegacyBridgeHut enterLegacyHut; LegacyBridgeHut enterLegacyHut;
public RepairBridge(Actor self, in Target target, EnterBehaviour enterBehaviour, string notification) public RepairBridge(Actor self, in Target target, EnterBehaviour enterBehaviour, string notification, Color targetLineColor)
: base(self, target, Color.Yellow) : base(self, target, targetLineColor)
{ {
this.enterBehaviour = enterBehaviour; this.enterBehaviour = enterBehaviour;
this.notification = notification; this.notification = notification;

View File

@@ -24,7 +24,7 @@ namespace OpenRA.Mods.Common.Activities
EngineerRepairable enterEngineerRepariable; EngineerRepairable enterEngineerRepariable;
public RepairBuilding(Actor self, in Target target, EngineerRepairInfo info) public RepairBuilding(Actor self, in Target target, EngineerRepairInfo info)
: base(self, target, Color.Yellow) : base(self, target, info.TargetLineColor)
{ {
this.info = info; this.info = info;
} }

View File

@@ -33,6 +33,7 @@ namespace OpenRA.Mods.Common.Activities
readonly ICallForTransport[] transportCallers; readonly ICallForTransport[] transportCallers;
readonly IMove move; readonly IMove move;
readonly Aircraft aircraft; readonly Aircraft aircraft;
readonly IMoveInfo moveInfo;
readonly bool stayOnResupplier; readonly bool stayOnResupplier;
readonly bool wasRepaired; readonly bool wasRepaired;
readonly PlayerResources playerResources; readonly PlayerResources playerResources;
@@ -58,6 +59,7 @@ namespace OpenRA.Mods.Common.Activities
transportCallers = self.TraitsImplementing<ICallForTransport>().ToArray(); transportCallers = self.TraitsImplementing<ICallForTransport>().ToArray();
move = self.Trait<IMove>(); move = self.Trait<IMove>();
aircraft = move as Aircraft; aircraft = move as Aircraft;
moveInfo = self.Info.TraitInfo<IMoveInfo>();
playerResources = self.Owner.PlayerActor.Trait<PlayerResources>(); playerResources = self.Owner.PlayerActor.Trait<PlayerResources>();
var valued = self.Info.TraitInfoOrDefault<ValuedInfo>(); var valued = self.Info.TraitInfoOrDefault<ValuedInfo>();
@@ -129,13 +131,12 @@ namespace OpenRA.Mods.Common.Activities
else if (activeResupplyTypes != 0 && aircraft == null && !isCloseEnough) else if (activeResupplyTypes != 0 && aircraft == null && !isCloseEnough)
{ {
var targetCell = self.World.Map.CellContaining(host.Actor.CenterPosition); var targetCell = self.World.Map.CellContaining(host.Actor.CenterPosition);
QueueChild(move.MoveWithinRange(host, closeEnough, targetLineColor: moveInfo.GetTargetLineColor()));
QueueChild(move.MoveWithinRange(host, closeEnough, targetLineColor: Color.Green));
// HACK: Repairable needs the actor to move to host center. // HACK: Repairable needs the actor to move to host center.
// TODO: Get rid of this or at least replace it with something less hacky. // TODO: Get rid of this or at least replace it with something less hacky.
if (repairableNear == null) if (repairableNear == null)
QueueChild(move.MoveTo(targetCell, targetLineColor: Color.Green)); QueueChild(move.MoveTo(targetCell, targetLineColor: moveInfo.GetTargetLineColor()));
var delta = (self.CenterPosition - host.CenterPosition).LengthSquared; var delta = (self.CenterPosition - host.CenterPosition).LengthSquared;
transportCallers.FirstOrDefault(t => t.MinimumDistance.LengthSquared < delta)?.RequestTransport(self, targetCell); transportCallers.FirstOrDefault(t => t.MinimumDistance.LengthSquared < delta)?.RequestTransport(self, targetCell);
@@ -189,7 +190,7 @@ namespace OpenRA.Mods.Common.Activities
public override IEnumerable<TargetLineNode> TargetLineNodes(Actor self) public override IEnumerable<TargetLineNode> TargetLineNodes(Actor self)
{ {
if (ChildActivity == null) if (ChildActivity == null)
yield return new TargetLineNode(host, Color.Green); yield return new TargetLineNode(host, moveInfo.GetTargetLineColor());
else else
{ {
var current = ChildActivity; var current = ChildActivity;
@@ -212,7 +213,7 @@ namespace OpenRA.Mods.Common.Activities
{ {
if (self.CurrentActivity.NextActivity == null && rp != null && rp.Path.Count > 0) if (self.CurrentActivity.NextActivity == null && rp != null && rp.Path.Count > 0)
foreach (var cell in rp.Path) foreach (var cell in rp.Path)
QueueChild(new AttackMoveActivity(self, () => move.MoveTo(cell, 1, ignoreActor: repairableNear != null ? null : host.Actor, targetLineColor: Color.OrangeRed))); QueueChild(new AttackMoveActivity(self, () => move.MoveTo(cell, 1, ignoreActor: repairableNear != null ? null : host.Actor, targetLineColor: aircraft.Info.TargetLineColor)));
else else
QueueChild(new TakeOff(self)); QueueChild(new TakeOff(self));
@@ -233,7 +234,7 @@ namespace OpenRA.Mods.Common.Activities
{ {
if (rp != null && rp.Path.Count > 0) if (rp != null && rp.Path.Count > 0)
foreach (var cell in rp.Path) foreach (var cell in rp.Path)
QueueChild(new AttackMoveActivity(self, () => move.MoveTo(cell, 1, repairableNear != null ? null : host.Actor, true, Color.OrangeRed))); QueueChild(new AttackMoveActivity(self, () => move.MoveTo(cell, 1, repairableNear != null ? null : host.Actor, true, moveInfo.GetTargetLineColor())));
else if (repairableNear == null) else if (repairableNear == null)
QueueChild(move.MoveToTarget(self, host)); QueueChild(move.MoveToTarget(self, host));
} }

View File

@@ -23,8 +23,8 @@ namespace OpenRA.Mods.Common.Activities
Cargo enterCargo; Cargo enterCargo;
Aircraft enterAircraft; Aircraft enterAircraft;
public RideTransport(Actor self, in Target target) public RideTransport(Actor self, in Target target, Color? targetLineColor)
: base(self, target, Color.Green) : base(self, target, targetLineColor)
{ {
passenger = self.Trait<Passenger>(); passenger = self.Trait<Passenger>();
} }

View File

@@ -35,7 +35,8 @@ namespace OpenRA.Mods.Common.Scripting
if (targetManager == null || !targetManager.CanBeTargetedBy(target, Self, captureManager)) if (targetManager == null || !targetManager.CanBeTargetedBy(target, Self, captureManager))
throw new LuaException("Actor '{0}' cannot capture actor '{1}'!".F(Self, target)); throw new LuaException("Actor '{0}' cannot capture actor '{1}'!".F(Self, target));
Self.QueueActivity(new CaptureActor(Self, Target.FromActor(target))); // NB: Scripted actions get no visible targetlines.
Self.QueueActivity(new CaptureActor(Self, Target.FromActor(target), null));
} }
} }
} }

View File

@@ -33,7 +33,9 @@ namespace OpenRA.Mods.Common.Scripting
public void DeliverCash(Actor target) public void DeliverCash(Actor target)
{ {
var t = Target.FromActor(target); var t = Target.FromActor(target);
Self.QueueActivity(new DonateCash(Self, t, info.Payload, info.PlayerExperience));
// NB: Scripted actions get no visible targetlines.
Self.QueueActivity(new DonateCash(Self, t, info.Payload, info.PlayerExperience, null));
} }
} }
@@ -62,9 +64,10 @@ namespace OpenRA.Mods.Common.Scripting
return; return;
var level = gainsExperience.Level; var level = gainsExperience.Level;
var t = Target.FromActor(target); var t = Target.FromActor(target);
Self.QueueActivity(new DonateExperience(Self, t, level, deliversExperience.PlayerExperience));
// NB: Scripted actions get no visible targetlines.
Self.QueueActivity(new DonateExperience(Self, t, level, deliversExperience.PlayerExperience, null));
} }
} }
} }

View File

@@ -31,8 +31,9 @@ namespace OpenRA.Mods.Common.Scripting
[Desc("Demolish the target actor.")] [Desc("Demolish the target actor.")]
public void Demolish(Actor target) public void Demolish(Actor target)
{ {
// NB: Scripted actions get no visible targetlines.
Self.QueueActivity(new Demolish(Self, Target.FromActor(target), info.EnterBehaviour, info.DetonationDelay, Self.QueueActivity(new Demolish(Self, Target.FromActor(target), info.EnterBehaviour, info.DetonationDelay,
info.Flashes, info.FlashesDelay, info.FlashInterval, info.DamageTypes)); info.Flashes, info.FlashesDelay, info.FlashInterval, info.DamageTypes, null));
} }
} }
} }

View File

@@ -63,7 +63,7 @@ namespace OpenRA.Mods.Common.Scripting
[Desc("Move to and enter the transport.")] [Desc("Move to and enter the transport.")]
public void EnterTransport(Actor transport) public void EnterTransport(Actor transport)
{ {
Self.QueueActivity(new RideTransport(Self, Target.FromActor(transport))); Self.QueueActivity(new RideTransport(Self, Target.FromActor(transport), null));
} }
[Desc("Whether the actor can move (false if immobilized).")] [Desc("Whether the actor can move (false if immobilized).")]

View File

@@ -94,6 +94,9 @@ namespace OpenRA.Mods.Common.Traits
[VoiceReference] [VoiceReference]
public readonly string Voice = "Action"; public readonly string Voice = "Action";
[Desc("Color to use for the target line for regular move orders.")]
public readonly Color TargetLineColor = Color.Green;
[GrantedConditionReference] [GrantedConditionReference]
[Desc("The condition to grant to self while airborne.")] [Desc("The condition to grant to self while airborne.")]
public readonly string AirborneCondition = null; public readonly string AirborneCondition = null;
@@ -165,6 +168,7 @@ namespace OpenRA.Mods.Common.Traits
public WAngle GetInitialFacing() { return InitialFacing; } public WAngle GetInitialFacing() { return InitialFacing; }
public WDist GetCruiseAltitude() { return CruiseAltitude; } public WDist GetCruiseAltitude() { return CruiseAltitude; }
public Color GetTargetLineColor() { return TargetLineColor; }
public override object Create(ActorInitializer init) { return new Aircraft(init, this); } public override object Create(ActorInitializer init) { return new Aircraft(init, this); }
@@ -1082,7 +1086,7 @@ namespace OpenRA.Mods.Common.Traits
var target = Target.FromCell(self.World, cell); var target = Target.FromCell(self.World, cell);
// TODO: this should scale with unit selection group size. // TODO: this should scale with unit selection group size.
self.QueueActivity(order.Queued, new Fly(self, target, WDist.FromCells(8), targetLineColor: Color.Green)); self.QueueActivity(order.Queued, new Fly(self, target, WDist.FromCells(8), targetLineColor: Info.TargetLineColor));
self.ShowTargetLines(); self.ShowTargetLines();
} }
else if (orderString == "Land") else if (orderString == "Land")
@@ -1096,7 +1100,7 @@ namespace OpenRA.Mods.Common.Traits
var target = Target.FromCell(self.World, cell); var target = Target.FromCell(self.World, cell);
self.QueueActivity(order.Queued, new Land(self, target, targetLineColor: Color.Green)); self.QueueActivity(order.Queued, new Land(self, target, targetLineColor: Info.TargetLineColor));
self.ShowTargetLines(); self.ShowTargetLines();
} }
else if (orderString == "Enter" || orderString == "ForceEnter" || orderString == "Repair") else if (orderString == "Enter" || orderString == "ForceEnter" || orderString == "Repair")

View File

@@ -24,6 +24,9 @@ namespace OpenRA.Mods.Common.Traits
[VoiceReference] [VoiceReference]
public readonly string Voice = "Action"; public readonly string Voice = "Action";
[Desc("Color to use for the target line.")]
public readonly Color TargetLineColor = Color.OrangeRed;
[GrantedConditionReference] [GrantedConditionReference]
[Desc("The condition to grant to self while an attack-move is active.")] [Desc("The condition to grant to self while an attack-move is active.")]
public readonly string AttackMoveCondition = null; public readonly string AttackMoveCondition = null;
@@ -76,7 +79,7 @@ namespace OpenRA.Mods.Common.Traits
var assaultMoving = order.OrderString == "AssaultMove"; var assaultMoving = order.OrderString == "AssaultMove";
// TODO: this should scale with unit selection group size. // TODO: this should scale with unit selection group size.
self.QueueActivity(order.Queued, new AttackMoveActivity(self, () => move.MoveTo(targetLocation, 8, targetLineColor: Color.OrangeRed), assaultMoving)); self.QueueActivity(order.Queued, new AttackMoveActivity(self, () => move.MoveTo(targetLocation, 8, targetLineColor: Info.TargetLineColor), assaultMoving));
self.ShowTargetLines(); self.ShowTargetLines();
} }
} }

View File

@@ -34,6 +34,9 @@ namespace OpenRA.Mods.Common.Traits
[VoiceReference] [VoiceReference]
public readonly string Voice = "Action"; public readonly string Voice = "Action";
[Desc("Color to use for the target line for regular move orders.")]
public readonly Color TargetLineColor = Color.Green;
[Desc("Require the force-move modifier to display the move cursor.")] [Desc("Require the force-move modifier to display the move cursor.")]
public readonly bool RequiresForceMove = false; public readonly bool RequiresForceMove = false;
@@ -113,7 +116,7 @@ namespace OpenRA.Mods.Common.Traits
if (!order.Queued) if (!order.Queued)
activity.NextActivity?.Cancel(self); activity.NextActivity?.Cancel(self);
activity.Queue(new IssueOrderAfterTransform("Move", order.Target, Color.Green)); activity.Queue(new IssueOrderAfterTransform("Move", order.Target, Info.TargetLineColor));
if (currentTransform == null) if (currentTransform == null)
self.QueueActivity(order.Queued, activity); self.QueueActivity(order.Queued, activity);

View File

@@ -58,6 +58,9 @@ namespace OpenRA.Mods.Common.Traits
[VoiceReference] [VoiceReference]
public readonly string Voice = "Action"; public readonly string Voice = "Action";
[Desc("Color to use for the target line.")]
public readonly Color TargetLineColor = Color.Crimson;
public override object Create(ActorInitializer init) { return new Captures(init.Self, this); } public override object Create(ActorInitializer init) { return new Captures(init.Self, this); }
} }
@@ -100,7 +103,7 @@ namespace OpenRA.Mods.Common.Traits
if (order.OrderString != "CaptureActor" || IsTraitDisabled) if (order.OrderString != "CaptureActor" || IsTraitDisabled)
return; return;
self.QueueActivity(order.Queued, new CaptureActor(self, order.Target)); self.QueueActivity(order.Queued, new CaptureActor(self, order.Target, Info.TargetLineColor));
self.ShowTargetLines(); self.ShowTargetLines();
} }

View File

@@ -60,6 +60,9 @@ namespace OpenRA.Mods.Common.Traits
[VoiceReference] [VoiceReference]
public readonly string Voice = "Action"; public readonly string Voice = "Action";
[Desc("Color to use for the target line.")]
public readonly Color TargetLineColor = Color.Yellow;
public override object Create(ActorInitializer init) { return new Carryall(init.Self, this); } public override object Create(ActorInitializer init) { return new Carryall(init.Self, this); }
} }

View File

@@ -12,6 +12,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using OpenRA.Mods.Common.Activities; using OpenRA.Mods.Common.Activities;
using OpenRA.Mods.Common.Orders; using OpenRA.Mods.Common.Orders;
using OpenRA.Primitives;
using OpenRA.Traits; using OpenRA.Traits;
namespace OpenRA.Mods.Common.Traits namespace OpenRA.Mods.Common.Traits
@@ -37,6 +38,9 @@ namespace OpenRA.Mods.Common.Traits
[VoiceReference] [VoiceReference]
public readonly string Voice = "Action"; public readonly string Voice = "Action";
[Desc("Color to use for the target line.")]
public readonly Color TargetLineColor = Color.Yellow;
public override object Create(ActorInitializer init) { return new DeliversCash(this); } public override object Create(ActorInitializer init) { return new DeliversCash(this); }
} }
@@ -75,7 +79,7 @@ namespace OpenRA.Mods.Common.Traits
if (order.OrderString != "DeliverCash") if (order.OrderString != "DeliverCash")
return; return;
self.QueueActivity(order.Queued, new DonateCash(self, order.Target, info.Payload, info.PlayerExperience)); self.QueueActivity(order.Queued, new DonateCash(self, order.Target, info.Payload, info.PlayerExperience, info.TargetLineColor));
self.ShowTargetLines(); self.ShowTargetLines();
} }

View File

@@ -12,6 +12,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using OpenRA.Mods.Common.Activities; using OpenRA.Mods.Common.Activities;
using OpenRA.Mods.Common.Orders; using OpenRA.Mods.Common.Orders;
using OpenRA.Primitives;
using OpenRA.Traits; using OpenRA.Traits;
namespace OpenRA.Mods.Common.Traits namespace OpenRA.Mods.Common.Traits
@@ -31,6 +32,9 @@ namespace OpenRA.Mods.Common.Traits
[VoiceReference] [VoiceReference]
public readonly string Voice = "Action"; public readonly string Voice = "Action";
[Desc("Color to use for the target line.")]
public readonly Color TargetLineColor = Color.Yellow;
public override object Create(ActorInitializer init) { return new DeliversExperience(init, this); } public override object Create(ActorInitializer init) { return new DeliversExperience(init, this); }
} }
@@ -86,7 +90,7 @@ namespace OpenRA.Mods.Common.Traits
else if (order.Target.Type != TargetType.FrozenActor) else if (order.Target.Type != TargetType.FrozenActor)
return; return;
self.QueueActivity(order.Queued, new DonateExperience(self, order.Target, gainsExperience.Level, info.PlayerExperience)); self.QueueActivity(order.Queued, new DonateExperience(self, order.Target, gainsExperience.Level, info.PlayerExperience, info.TargetLineColor));
self.ShowTargetLines(); self.ShowTargetLines();
} }

View File

@@ -44,6 +44,9 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Voice string when planting explosive charges.")] [Desc("Voice string when planting explosive charges.")]
public readonly string Voice = "Action"; public readonly string Voice = "Action";
[Desc("Color to use for the target line.")]
public readonly Color TargetLineColor = Color.Crimson;
public readonly PlayerRelationship TargetStances = PlayerRelationship.Enemy | PlayerRelationship.Neutral; public readonly PlayerRelationship TargetStances = PlayerRelationship.Enemy | PlayerRelationship.Neutral;
public readonly PlayerRelationship ForceTargetStances = PlayerRelationship.Enemy | PlayerRelationship.Neutral | PlayerRelationship.Ally; public readonly PlayerRelationship ForceTargetStances = PlayerRelationship.Enemy | PlayerRelationship.Neutral | PlayerRelationship.Ally;
@@ -88,7 +91,7 @@ namespace OpenRA.Mods.Common.Traits
} }
self.QueueActivity(order.Queued, new Demolish(self, order.Target, info.EnterBehaviour, info.DetonationDelay, self.QueueActivity(order.Queued, new Demolish(self, order.Target, info.EnterBehaviour, info.DetonationDelay,
info.Flashes, info.FlashesDelay, info.FlashInterval, info.DamageTypes)); info.Flashes, info.FlashesDelay, info.FlashInterval, info.DamageTypes, info.TargetLineColor));
self.ShowTargetLines(); self.ShowTargetLines();
} }

View File

@@ -26,6 +26,9 @@ namespace OpenRA.Mods.Common.Traits
[VoiceReference] [VoiceReference]
public readonly string Voice = "Action"; public readonly string Voice = "Action";
[Desc("Color to use for the target line.")]
public readonly Color TargetLineColor = Color.Yellow;
[Desc("Behaviour when entering the structure.", [Desc("Behaviour when entering the structure.",
"Possible values are Exit, Suicide, Dispose.")] "Possible values are Exit, Suicide, Dispose.")]
public readonly EnterBehaviour EnterBehaviour = EnterBehaviour.Dispose; public readonly EnterBehaviour EnterBehaviour = EnterBehaviour.Dispose;

View File

@@ -31,6 +31,9 @@ namespace OpenRA.Mods.Common.Traits
[VoiceReference] [VoiceReference]
public readonly string Voice = "Action"; public readonly string Voice = "Action";
[Desc("Color to use for the target line while in tunnels.")]
public readonly Color TargetLineColor = Color.Green;
[ConsumedConditionReference] [ConsumedConditionReference]
[Desc("Boolean expression defining the condition under which the regular (non-force) enter cursor is disabled.")] [Desc("Boolean expression defining the condition under which the regular (non-force) enter cursor is disabled.")]
public readonly BooleanExpression RequireForceMoveCondition = null; public readonly BooleanExpression RequireForceMoveCondition = null;
@@ -42,12 +45,14 @@ namespace OpenRA.Mods.Common.Traits
{ {
readonly EntersTunnelsInfo info; readonly EntersTunnelsInfo info;
readonly IMove move; readonly IMove move;
readonly IMoveInfo moveInfo;
bool requireForceMove; bool requireForceMove;
public EntersTunnels(Actor self, EntersTunnelsInfo info) public EntersTunnels(Actor self, EntersTunnelsInfo info)
{ {
this.info = info; this.info = info;
move = self.Trait<IMove>(); move = self.Trait<IMove>();
moveInfo = self.Info.TraitInfo<IMoveInfo>();
} }
public IEnumerable<IOrderTargeter> Orders public IEnumerable<IOrderTargeter> Orders
@@ -85,8 +90,8 @@ namespace OpenRA.Mods.Common.Traits
if (tunnel == null || !tunnel.Exit.HasValue) if (tunnel == null || !tunnel.Exit.HasValue)
return; return;
self.QueueActivity(order.Queued, move.MoveTo(tunnel.Entrance, tunnel.NearEnough, targetLineColor: Color.Green)); self.QueueActivity(order.Queued, move.MoveTo(tunnel.Entrance, tunnel.NearEnough, targetLineColor: moveInfo.GetTargetLineColor()));
self.QueueActivity(move.MoveTo(tunnel.Exit.Value, tunnel.NearEnough, targetLineColor: Color.Green)); self.QueueActivity(move.MoveTo(tunnel.Exit.Value, tunnel.NearEnough, targetLineColor: info.TargetLineColor));
self.ShowTargetLines(); self.ShowTargetLines();
} }

View File

@@ -21,6 +21,9 @@ namespace OpenRA.Mods.Common.Traits
[VoiceReference] [VoiceReference]
public readonly string Voice = "Action"; public readonly string Voice = "Action";
[Desc("Color to use for the target line.")]
public readonly Color TargetLineColor = Color.OrangeRed;
public override object Create(ActorInitializer init) { return new Guard(this); } public override object Create(ActorInitializer init) { return new Guard(this); }
} }
@@ -51,7 +54,7 @@ namespace OpenRA.Mods.Common.Traits
return; return;
var range = target.Actor.Info.TraitInfo<GuardableInfo>().Range; var range = target.Actor.Info.TraitInfo<GuardableInfo>().Range;
self.QueueActivity(queued, new AttackMoveActivity(self, () => move.MoveFollow(self, target, WDist.Zero, range, targetLineColor: Color.OrangeRed))); self.QueueActivity(queued, new AttackMoveActivity(self, () => move.MoveFollow(self, target, WDist.Zero, range, targetLineColor: info.TargetLineColor)));
self.ShowTargetLines(); self.ShowTargetLines();
} }

View File

@@ -16,6 +16,7 @@ using OpenRA.Activities;
using OpenRA.Mods.Common.Activities; using OpenRA.Mods.Common.Activities;
using OpenRA.Mods.Common.Orders; using OpenRA.Mods.Common.Orders;
using OpenRA.Mods.Common.Pathfinder; using OpenRA.Mods.Common.Pathfinder;
using OpenRA.Primitives;
using OpenRA.Traits; using OpenRA.Traits;
namespace OpenRA.Mods.Common.Traits namespace OpenRA.Mods.Common.Traits
@@ -83,6 +84,12 @@ namespace OpenRA.Mods.Common.Traits
[VoiceReference] [VoiceReference]
public readonly string DeliverVoice = "Action"; public readonly string DeliverVoice = "Action";
[Desc("Color to use for the target line of harvest orders.")]
public readonly Color HarvestLineColor = Color.Crimson;
[Desc("Color to use for the target line of harvest orders.")]
public readonly Color DeliverLineColor = Color.Green;
[Desc("Cursor to display when able to unload at target actor.")] [Desc("Cursor to display when able to unload at target actor.")]
public readonly string EnterCursor = "enter"; public readonly string EnterCursor = "enter";

View File

@@ -49,6 +49,9 @@ namespace OpenRA.Mods.Common.Traits
[VoiceReference] [VoiceReference]
public readonly string Voice = "Action"; public readonly string Voice = "Action";
[Desc("Color to use for the target line for regular move orders.")]
public readonly Color TargetLineColor = Color.Green;
[Desc("Facing to use for actor previews (map editor, color picker, etc)")] [Desc("Facing to use for actor previews (map editor, color picker, etc)")]
public readonly WAngle PreviewFacing = new WAngle(384); public readonly WAngle PreviewFacing = new WAngle(384);
@@ -68,6 +71,8 @@ namespace OpenRA.Mods.Common.Traits
yield return new FacingInit(PreviewFacing); yield return new FacingInit(PreviewFacing);
} }
public Color GetTargetLineColor() { return TargetLineColor; }
public override object Create(ActorInitializer init) { return new Mobile(init, this); } public override object Create(ActorInitializer init) { return new Mobile(init, this); }
public LocomotorInfo LocomotorInfo { get; private set; } public LocomotorInfo LocomotorInfo { get; private set; }
@@ -923,7 +928,7 @@ namespace OpenRA.Mods.Common.Traits
if (!Info.LocomotorInfo.MoveIntoShroud && !self.Owner.Shroud.IsExplored(cell)) if (!Info.LocomotorInfo.MoveIntoShroud && !self.Owner.Shroud.IsExplored(cell))
return; return;
self.QueueActivity(order.Queued, WrapMove(new Move(self, cell, WDist.FromCells(8), null, true, Color.Green))); self.QueueActivity(order.Queued, WrapMove(new Move(self, cell, WDist.FromCells(8), null, true, Info.TargetLineColor)));
self.ShowTargetLines(); self.ShowTargetLines();
} }

View File

@@ -12,6 +12,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using OpenRA.Mods.Common.Activities; using OpenRA.Mods.Common.Activities;
using OpenRA.Mods.Common.Orders; using OpenRA.Mods.Common.Orders;
using OpenRA.Primitives;
using OpenRA.Support; using OpenRA.Support;
using OpenRA.Traits; using OpenRA.Traits;
@@ -42,6 +43,9 @@ namespace OpenRA.Mods.Common.Traits
[VoiceReference] [VoiceReference]
public readonly string Voice = "Action"; public readonly string Voice = "Action";
[Desc("Color to use for the target line.")]
public readonly Color TargetLineColor = Color.Green;
[ConsumedConditionReference] [ConsumedConditionReference]
[Desc("Boolean expression defining the condition under which the regular (non-force) enter cursor is disabled.")] [Desc("Boolean expression defining the condition under which the regular (non-force) enter cursor is disabled.")]
public readonly BooleanExpression RequireForceMoveCondition = null; public readonly BooleanExpression RequireForceMoveCondition = null;
@@ -173,7 +177,7 @@ namespace OpenRA.Mods.Common.Traits
if (!IsCorrectCargoType(targetActor)) if (!IsCorrectCargoType(targetActor))
return; return;
self.QueueActivity(order.Queued, new RideTransport(self, order.Target)); self.QueueActivity(order.Queued, new RideTransport(self, order.Target, Info.TargetLineColor));
self.ShowTargetLines(); self.ShowTargetLines();
} }

View File

@@ -12,6 +12,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using OpenRA.Mods.Common.Activities; using OpenRA.Mods.Common.Activities;
using OpenRA.Mods.Common.Orders; using OpenRA.Mods.Common.Orders;
using OpenRA.Primitives;
using OpenRA.Traits; using OpenRA.Traits;
namespace OpenRA.Mods.Common.Traits namespace OpenRA.Mods.Common.Traits
@@ -22,6 +23,9 @@ namespace OpenRA.Mods.Common.Traits
[VoiceReference] [VoiceReference]
public readonly string Voice = "Action"; public readonly string Voice = "Action";
[Desc("Color to use for the target line.")]
public readonly Color TargetLineColor = Color.Yellow;
[Desc("Behaviour when entering the structure.", [Desc("Behaviour when entering the structure.",
"Possible values are Exit, Suicide, Dispose.")] "Possible values are Exit, Suicide, Dispose.")]
public readonly EnterBehaviour EnterBehaviour = EnterBehaviour.Dispose; public readonly EnterBehaviour EnterBehaviour = EnterBehaviour.Dispose;
@@ -101,7 +105,7 @@ namespace OpenRA.Mods.Common.Traits
else else
return; return;
self.QueueActivity(order.Queued, new RepairBridge(self, order.Target, info.EnterBehaviour, info.RepairNotification)); self.QueueActivity(order.Queued, new RepairBridge(self, order.Target, info.EnterBehaviour, info.RepairNotification, info.TargetLineColor));
self.ShowTargetLines(); self.ShowTargetLines();
} }
} }