Merge pull request #7815 from Phrohdoh/aircraft-turn-timing

Expose Plane turn-to-attack delay to yaml.
This commit is contained in:
Oliver Brakmann
2015-04-03 23:15:41 +02:00
13 changed files with 60 additions and 45 deletions

View File

@@ -63,7 +63,8 @@ namespace OpenRA.Mods.Cnc.Traits
new FacingInit(64) new FacingInit(64)
}); });
actor.QueueActivity(new Fly(actor, Target.FromCell(w, self.Location + new CVec(9, 0)))); var plane = actor.Trait<Plane>();
actor.QueueActivity(new Fly(actor, Target.FromCell(w, self.Location + new CVec(9, 0)), plane));
actor.QueueActivity(new Land(actor, Target.FromActor(self))); actor.QueueActivity(new Land(actor, Target.FromActor(self)));
actor.QueueActivity(new CallFunc(() => actor.QueueActivity(new CallFunc(() =>
{ {
@@ -77,7 +78,7 @@ namespace OpenRA.Mods.Cnc.Traits
Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", info.ReadyAudio, self.Owner.Country.Race); Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", info.ReadyAudio, self.Owner.Country.Race);
})); }));
actor.QueueActivity(new Fly(actor, Target.FromCell(w, endPos))); actor.QueueActivity(new Fly(actor, Target.FromCell(w, endPos), plane));
actor.QueueActivity(new RemoveSelf()); actor.QueueActivity(new RemoveSelf());
}); });

View File

@@ -22,14 +22,14 @@ namespace OpenRA.Mods.Common.Activities
readonly WRange maxRange; readonly WRange maxRange;
readonly WRange minRange; readonly WRange minRange;
public Fly(Actor self, Target t) public Fly(Actor self, Target t, Plane plane)
{ {
plane = self.Trait<Plane>();
target = t; target = t;
this.plane = plane;
} }
public Fly(Actor self, Target t, WRange minRange, WRange maxRange) public Fly(Actor self, Target t, Plane plane, WRange minRange, WRange maxRange)
: this(self, t) : this(self, t, plane)
{ {
this.maxRange = maxRange; this.maxRange = maxRange;
this.minRange = minRange; this.minRange = minRange;

View File

@@ -21,13 +21,16 @@ namespace OpenRA.Mods.Common.Activities
{ {
readonly Target target; readonly Target target;
readonly AttackPlane attackPlane; readonly AttackPlane attackPlane;
readonly Plane plane;
readonly IEnumerable<AmmoPool> ammoPools; readonly IEnumerable<AmmoPool> ammoPools;
Activity inner; Activity inner;
int ticksUntilTurn = 50; int ticksUntilTurn;
public FlyAttack(Actor self, Target target) public FlyAttack(Actor self, Target target, Plane plane)
{ {
this.target = target; this.target = target;
this.plane = plane;
ticksUntilTurn = plane.Info.AttackTurnDelay;
attackPlane = self.TraitOrDefault<AttackPlane>(); attackPlane = self.TraitOrDefault<AttackPlane>();
ammoPools = self.TraitsImplementing<AmmoPool>(); ammoPools = self.TraitsImplementing<AmmoPool>();
} }
@@ -52,9 +55,9 @@ namespace OpenRA.Mods.Common.Activities
// TODO: This should fire each weapon at its maximum range // TODO: This should fire each weapon at its maximum range
if (target.IsInRange(self.CenterPosition, attackPlane.Armaments.Select(a => a.Weapon.MinRange).Min())) if (target.IsInRange(self.CenterPosition, attackPlane.Armaments.Select(a => a.Weapon.MinRange).Min()))
inner = Util.SequenceActivities(new FlyTimed(ticksUntilTurn, self), new Fly(self, target), new FlyTimed(ticksUntilTurn, self)); inner = Util.SequenceActivities(new FlyTimed(ticksUntilTurn, self), new Fly(self, target, plane), new FlyTimed(ticksUntilTurn, self));
else else
inner = Util.SequenceActivities(new Fly(self, target), new FlyTimed(ticksUntilTurn, self)); inner = Util.SequenceActivities(new Fly(self, target, plane), new FlyTimed(ticksUntilTurn, self));
} }
inner = Util.RunActivity(self, inner); inner = Util.RunActivity(self, inner);

View File

@@ -21,10 +21,10 @@ namespace OpenRA.Mods.Common.Activities
WRange minRange; WRange minRange;
WRange maxRange; WRange maxRange;
public FlyFollow(Actor self, Target target, WRange minRange, WRange maxRange) public FlyFollow(Actor self, Target target, Plane plane, WRange minRange, WRange maxRange)
{ {
this.target = target; this.target = target;
plane = self.Trait<Plane>(); this.plane = plane;
this.minRange = minRange; this.minRange = minRange;
this.maxRange = maxRange; this.maxRange = maxRange;
} }
@@ -40,7 +40,7 @@ namespace OpenRA.Mods.Common.Activities
return this; return this;
} }
return Util.SequenceActivities(new Fly(self, target, minRange, maxRange), this); return Util.SequenceActivities(new Fly(self, target, plane, minRange, maxRange), this);
} }
} }
} }

View File

@@ -24,11 +24,11 @@ namespace OpenRA.Mods.Common.Activities
Actor dest; Actor dest;
WPos w1, w2, w3; WPos w1, w2, w3;
public ReturnToBase(Actor self, Actor dest) public ReturnToBase(Actor self, Actor dest, Plane plane)
{ {
this.dest = dest; this.dest = dest;
plane = self.Trait<Plane>(); this.plane = plane;
planeInfo = self.Info.Traits.Get<PlaneInfo>(); planeInfo = plane.Info;
} }
public static Actor ChooseAirfield(Actor self, bool unreservedOnly) public static Actor ChooseAirfield(Actor self, bool unreservedOnly)
@@ -113,15 +113,15 @@ namespace OpenRA.Mods.Common.Activities
self.CancelActivity(); self.CancelActivity();
if (nearestAfld != null) if (nearestAfld != null)
return Util.SequenceActivities(new Fly(self, Target.FromActor(nearestAfld)), new FlyCircle(self)); return Util.SequenceActivities(new Fly(self, Target.FromActor(nearestAfld), plane), new FlyCircle(self));
else else
return new FlyCircle(self); return new FlyCircle(self);
} }
return Util.SequenceActivities( return Util.SequenceActivities(
new Fly(self, Target.FromPos(w1)), new Fly(self, Target.FromPos(w1), plane),
new Fly(self, Target.FromPos(w2)), new Fly(self, Target.FromPos(w2), plane),
new Fly(self, Target.FromPos(w3)), new Fly(self, Target.FromPos(w3), plane),
new Land(self, Target.FromActor(dest)), new Land(self, Target.FromActor(dest)),
NextActivity); NextActivity);
} }

View File

@@ -25,14 +25,14 @@ namespace OpenRA.Mods.Common.Scripting
[Desc("Fly within the cell grid.")] [Desc("Fly within the cell grid.")]
public void Move(CPos cell) public void Move(CPos cell)
{ {
Self.QueueActivity(new Fly(Self, Target.FromCell(Self.World, cell))); Self.QueueActivity(new Fly(Self, Target.FromCell(Self.World, cell), Self.Trait<Plane>()));
} }
[ScriptActorPropertyActivity] [ScriptActorPropertyActivity]
[Desc("Return to the base, which is either the airfield given, or an auto-selected one otherwise.")] [Desc("Return to the base, which is either the airfield given, or an auto-selected one otherwise.")]
public void ReturnToBase(Actor airfield = null) public void ReturnToBase(Actor airfield = null)
{ {
Self.QueueActivity(new ReturnToBase(Self, airfield)); Self.QueueActivity(new ReturnToBase(Self, airfield, Self.Trait<Plane>()));
} }
} }
@@ -45,7 +45,7 @@ namespace OpenRA.Mods.Common.Scripting
[Desc("Fly an attack against the target actor.")] [Desc("Fly an attack against the target actor.")]
public void Attack(Actor target) public void Attack(Actor target)
{ {
Self.QueueActivity(new FlyAttack(Self, Target.FromActor(target))); Self.QueueActivity(new FlyAttack(Self, Target.FromActor(target), Self.Trait<Plane>()));
} }
} }
} }

View File

@@ -14,19 +14,24 @@ using OpenRA.Traits;
namespace OpenRA.Mods.Common.Traits namespace OpenRA.Mods.Common.Traits
{ {
public class AttackPlaneInfo : AttackFrontalInfo public class AttackPlaneInfo : AttackFrontalInfo, Requires<PlaneInfo>
{ {
public override object Create(ActorInitializer init) { return new AttackPlane(init.Self, this); } public override object Create(ActorInitializer init) { return new AttackPlane(init.Self, this); }
} }
public class AttackPlane : AttackFrontal public class AttackPlane : AttackFrontal
{ {
readonly Plane plane;
public AttackPlane(Actor self, AttackPlaneInfo info) public AttackPlane(Actor self, AttackPlaneInfo info)
: base(self, info) { } : base(self, info)
{
plane = self.Trait<Plane>();
}
public override Activity GetAttackActivity(Actor self, Target newTarget, bool allowMove) public override Activity GetAttackActivity(Actor self, Target newTarget, bool allowMove)
{ {
return new FlyAttack(self, newTarget); return new FlyAttack(self, newTarget, plane);
} }
protected override bool CanAttack(Actor self, Target target) protected override bool CanAttack(Actor self, Target target)

View File

@@ -20,6 +20,9 @@ namespace OpenRA.Mods.Common.Traits
{ {
public readonly WAngle MaximumPitch = WAngle.FromDegrees(10); public readonly WAngle MaximumPitch = WAngle.FromDegrees(10);
[Desc("Delay, in game ticks, before turning to attack.")]
public readonly int AttackTurnDelay = 50;
public override object Create(ActorInitializer init) { return new Plane(init, this); } public override object Create(ActorInitializer init) { return new Plane(init, this); }
} }
@@ -88,7 +91,7 @@ namespace OpenRA.Mods.Common.Traits
var target = Target.FromCell(self.World, cell); var target = Target.FromCell(self.World, cell);
self.SetTargetLine(target, Color.Green); self.SetTargetLine(target, Color.Green);
self.CancelActivity(); self.CancelActivity();
self.QueueActivity(new Fly(self, target)); self.QueueActivity(new Fly(self, target, this));
self.QueueActivity(new FlyCircle(self)); self.QueueActivity(new FlyCircle(self));
} }
else if (order.OrderString == "Enter") else if (order.OrderString == "Enter")
@@ -100,7 +103,7 @@ namespace OpenRA.Mods.Common.Traits
self.SetTargetLine(Target.FromOrder(self.World, order), Color.Green); self.SetTargetLine(Target.FromOrder(self.World, order), Color.Green);
self.CancelActivity(); self.CancelActivity();
self.QueueActivity(new ReturnToBase(self, order.TargetActor)); self.QueueActivity(new ReturnToBase(self, order.TargetActor, this));
self.QueueActivity(new ResupplyAircraft(self)); self.QueueActivity(new ResupplyAircraft(self));
} }
else if (order.OrderString == "Stop") else if (order.OrderString == "Stop")
@@ -116,7 +119,7 @@ namespace OpenRA.Mods.Common.Traits
UnReserve(); UnReserve();
self.CancelActivity(); self.CancelActivity();
self.SetTargetLine(Target.FromActor(airfield), Color.Green); self.SetTargetLine(Target.FromActor(airfield), Color.Green);
self.QueueActivity(new ReturnToBase(self, airfield)); self.QueueActivity(new ReturnToBase(self, airfield, this));
self.QueueActivity(new ResupplyAircraft(self)); self.QueueActivity(new ResupplyAircraft(self));
} }
else else
@@ -126,24 +129,24 @@ namespace OpenRA.Mods.Common.Traits
} }
} }
public Activity MoveTo(CPos cell, int nearEnough) { return Util.SequenceActivities(new Fly(self, Target.FromCell(self.World, cell)), new FlyCircle(self)); } public Activity MoveTo(CPos cell, int nearEnough) { return Util.SequenceActivities(new Fly(self, Target.FromCell(self.World, cell), this), new FlyCircle(self)); }
public Activity MoveTo(CPos cell, Actor ignoredActor) { return Util.SequenceActivities(new Fly(self, Target.FromCell(self.World, cell)), new FlyCircle(self)); } public Activity MoveTo(CPos cell, Actor ignoredActor) { return Util.SequenceActivities(new Fly(self, Target.FromCell(self.World, cell), this), new FlyCircle(self)); }
public Activity MoveWithinRange(Target target, WRange range) { return Util.SequenceActivities(new Fly(self, target, WRange.Zero, range), new FlyCircle(self)); } public Activity MoveWithinRange(Target target, WRange range) { return Util.SequenceActivities(new Fly(self, target, this, WRange.Zero, range), new FlyCircle(self)); }
public Activity MoveWithinRange(Target target, WRange minRange, WRange maxRange) public Activity MoveWithinRange(Target target, WRange minRange, WRange maxRange)
{ {
return Util.SequenceActivities(new Fly(self, target, minRange, maxRange), new FlyCircle(self)); return Util.SequenceActivities(new Fly(self, target, this, minRange, maxRange), new FlyCircle(self));
} }
public Activity MoveFollow(Actor self, Target target, WRange minRange, WRange maxRange) { return new FlyFollow(self, target, minRange, maxRange); } public Activity MoveFollow(Actor self, Target target, WRange minRange, WRange maxRange) { return new FlyFollow(self, target, this, minRange, maxRange); }
public CPos NearestMoveableCell(CPos cell) { return cell; } public CPos NearestMoveableCell(CPos cell) { return cell; }
public Activity MoveIntoWorld(Actor self, CPos cell, SubCell subCell = SubCell.Any) { return new Fly(self, Target.FromCell(self.World, cell)); } public Activity MoveIntoWorld(Actor self, CPos cell, SubCell subCell = SubCell.Any) { return new Fly(self, Target.FromCell(self.World, cell), this); }
public Activity VisualMove(Actor self, WPos fromPos, WPos toPos) public Activity VisualMove(Actor self, WPos fromPos, WPos toPos)
{ {
return Util.SequenceActivities(new CallFunc(() => SetVisualPosition(self, fromPos)), new Fly(self, Target.FromPos(toPos))); return Util.SequenceActivities(new CallFunc(() => SetVisualPosition(self, fromPos)), new Fly(self, Target.FromPos(toPos), this));
} }
public Activity MoveToTarget(Actor self, Target target) { return new Fly(self, target, WRange.FromCells(3), WRange.FromCells(5)); } public Activity MoveToTarget(Actor self, Target target) { return new Fly(self, target, this, WRange.FromCells(3), WRange.FromCells(5)); }
public Activity MoveIntoTarget(Actor self, Target target) { return new Land(self, target); } public Activity MoveIntoTarget(Actor self, Target target) { return new Land(self, target); }
} }
} }

View File

@@ -28,7 +28,7 @@ namespace OpenRA.Mods.Common.Traits
var airfield = ReturnToBase.ChooseAirfield(self, true); var airfield = ReturnToBase.ChooseAirfield(self, true);
if (airfield != null) if (airfield != null)
{ {
self.QueueActivity(new ReturnToBase(self, airfield)); self.QueueActivity(new ReturnToBase(self, airfield, self.Trait<Plane>()));
self.QueueActivity(new ResupplyAircraft(self)); self.QueueActivity(new ResupplyAircraft(self));
} }
else else
@@ -54,7 +54,7 @@ namespace OpenRA.Mods.Common.Traits
return; return;
} }
self.QueueActivity(new Fly(self, Target.FromActor(someBuilding))); self.QueueActivity(new Fly(self, Target.FromActor(someBuilding), self.Trait<Plane>()));
self.QueueActivity(new FlyCircle(self)); self.QueueActivity(new FlyCircle(self));
} }
} }

View File

@@ -155,8 +155,10 @@ namespace OpenRA.Mods.Common.Traits
attack.OnExitedAttackRange += onExitRange; attack.OnExitedAttackRange += onExitRange;
attack.OnRemovedFromWorld += onExitRange; attack.OnRemovedFromWorld += onExitRange;
a.QueueActivity(new Fly(a, Target.FromPos(target + spawnOffset))); var plane = a.Trait<Plane>();
a.QueueActivity(new Fly(a, Target.FromPos(finishEdge + spawnOffset))); a.QueueActivity(new Fly(a, Target.FromPos(target + spawnOffset), plane));
a.QueueActivity(new Fly(a, Target.FromPos(finishEdge + spawnOffset), plane));
a.QueueActivity(new RemoveSelf()); a.QueueActivity(new RemoveSelf());
aircraftInRange.Add(a, false); aircraftInRange.Add(a, false);
distanceTestActor = a; distanceTestActor = a;

View File

@@ -123,7 +123,7 @@ namespace OpenRA.Mods.Common.Traits
plane.Trait<Cargo>().Load(plane, crate); plane.Trait<Cargo>().Load(plane, crate);
plane.CancelActivity(); plane.CancelActivity();
plane.QueueActivity(new Fly(plane, Target.FromPos(finishEdge))); plane.QueueActivity(new Fly(plane, Target.FromPos(finishEdge), plane.Trait<Plane>()));
plane.QueueActivity(new RemoveSelf()); plane.QueueActivity(new RemoveSelf());
} }
else else

View File

@@ -31,7 +31,7 @@ namespace OpenRA.Mods.RA.Scripting
public void Paradrop(CPos cell) public void Paradrop(CPos cell)
{ {
paradrop.SetLZ(cell, true); paradrop.SetLZ(cell, true);
Self.QueueActivity(new Fly(Self, Target.FromCell(Self.World, cell))); Self.QueueActivity(new Fly(Self, Target.FromCell(Self.World, cell), Self.Trait<Plane>()));
Self.QueueActivity(new FlyOffMap(Self)); Self.QueueActivity(new FlyOffMap(Self));
Self.QueueActivity(new RemoveSelf()); Self.QueueActivity(new RemoveSelf());
} }

View File

@@ -184,8 +184,9 @@ namespace OpenRA.Mods.RA.Traits
foreach (var p in passengers) foreach (var p in passengers)
cargo.Load(a, p); cargo.Load(a, p);
a.QueueActivity(new Fly(a, Target.FromPos(target + spawnOffset))); var plane = a.Trait<Plane>();
a.QueueActivity(new Fly(a, Target.FromPos(finishEdge + spawnOffset))); a.QueueActivity(new Fly(a, Target.FromPos(target + spawnOffset), plane));
a.QueueActivity(new Fly(a, Target.FromPos(finishEdge + spawnOffset), plane));
a.QueueActivity(new RemoveSelf()); a.QueueActivity(new RemoveSelf());
aircraftInRange.Add(a, false); aircraftInRange.Add(a, false);
distanceTestActor = a; distanceTestActor = a;