Skip to content

Commit

Permalink
Refactor FlyAttack to make strafing runs interruptible when target be…
Browse files Browse the repository at this point in the history
…comes invalid.
  • Loading branch information
tovl authored and abcdefg30 committed Aug 18, 2019
1 parent e600848 commit 70459b3
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 17 deletions.
38 changes: 21 additions & 17 deletions OpenRA.Mods.Common/Activities/Air/FlyAttack.cs
Expand Up @@ -24,7 +24,6 @@ public class FlyAttack : Activity, IActivityNotifyStanceChanged
readonly AttackAircraft attackAircraft;
readonly Rearmable rearmable;
readonly bool forceAttack;
readonly int ticksUntilTurn;
readonly Color? targetLineColor;

Target target;
Expand All @@ -35,6 +34,7 @@ public class FlyAttack : Activity, IActivityNotifyStanceChanged
bool useLastVisibleTarget;
bool hasTicked;
bool returnToBase;
int remainingTicksUntilTurn;

public FlyAttack(Actor self, Target target, bool forceAttack, Color? targetLineColor)
{
Expand All @@ -45,7 +45,6 @@ public FlyAttack(Actor self, Target target, bool forceAttack, Color? targetLineC
aircraft = self.Trait<Aircraft>();
attackAircraft = self.Trait<AttackAircraft>();
rearmable = self.TraitOrDefault<Rearmable>();
ticksUntilTurn = attackAircraft.Info.AttackTurnDelay;

// The target may become hidden between the initial order request and the first tick (e.g. if queued)
// Moving to any position (even if quite stale) is still better than immediately giving up
Expand Down Expand Up @@ -132,28 +131,33 @@ public override bool Tick(Actor self)

var delta = attackAircraft.GetTargetPosition(pos, target) - pos;
var desiredFacing = delta.HorizontalLengthSquared != 0 ? delta.Yaw.Facing : aircraft.Facing;
var isAirborne = self.World.Map.DistanceAboveTerrain(pos).Length >= aircraft.Info.MinAirborneAltitude;

if (!isAirborne)
QueueChild(new TakeOff(self));
QueueChild(new TakeOff(self));

if (attackAircraft.Info.AttackType == AirAttackType.Strafe)
{
if (target.IsInRange(pos, attackAircraft.GetMinimumRange()))
QueueChild(new FlyTimed(ticksUntilTurn, self));
var minimumRange = attackAircraft.Info.AttackType == AirAttackType.Strafe ? WDist.Zero : attackAircraft.GetMinimumRangeVersusTarget(target);

QueueChild(new Fly(self, target, target.CenterPosition, Color.Red));
QueueChild(new FlyTimed(ticksUntilTurn, self));
// When strafing we must move forward for a minimum number of ticks after passing the target.
if (remainingTicksUntilTurn > 0)
{
Fly.FlyTick(self, aircraft, aircraft.Facing, aircraft.Info.CruiseAltitude);
remainingTicksUntilTurn--;
}
else

// Move into range of the target.
else if (!target.IsInRange(pos, lastVisibleMaximumRange) || target.IsInRange(pos, minimumRange))
QueueChild(aircraft.MoveWithinRange(target, minimumRange, lastVisibleMaximumRange, target.CenterPosition, Color.Red));

// The aircraft must keep moving forward even if it is already in an ideal position.
else if (!aircraft.Info.CanHover || attackAircraft.Info.AttackType == AirAttackType.Strafe)
{
var minimumRange = attackAircraft.GetMinimumRangeVersusTarget(target);
if (!target.IsInRange(pos, lastVisibleMaximumRange) || target.IsInRange(pos, minimumRange))
QueueChild(new Fly(self, target, minimumRange, lastVisibleMaximumRange, target.CenterPosition, Color.Red));
else if (isAirborne) // Don't use 'else' to avoid conflict with TakeOff
Fly.VerticalTakeOffOrLandTick(self, aircraft, desiredFacing, aircraft.Info.CruiseAltitude);
Fly.FlyTick(self, aircraft, aircraft.Facing, aircraft.Info.CruiseAltitude);
remainingTicksUntilTurn = attackAircraft.Info.AttackTurnDelay;
}

// Turn to face the target if required.
else if (!attackAircraft.TargetInFiringArc(self, target, attackAircraft.Info.FacingTolerance))
aircraft.Facing = Util.TickFacing(aircraft.Facing, desiredFacing, aircraft.TurnSpeed);

return false;
}

Expand Down
3 changes: 3 additions & 0 deletions OpenRA.Mods.Common/Activities/Air/TakeOff.cs
Expand Up @@ -39,6 +39,9 @@ protected override void OnFirstRun(Actor self)
if (aircraft.ForceLanding)
return;

if (self.World.Map.DistanceAboveTerrain(aircraft.CenterPosition).Length >= aircraft.Info.MinAirborneAltitude)
return;

// We are taking off, so remove reservation and influence in ground cells.
aircraft.UnReserve();
aircraft.RemoveInfluence();
Expand Down

0 comments on commit 70459b3

Please sign in to comment.