Allow voxel-based aircraft to pitch and roll.

This commit is contained in:
Paul Chote
2020-06-21 10:33:21 +01:00
committed by tovl
parent 43717a89b5
commit 6dcde3af72
5 changed files with 71 additions and 12 deletions

View File

@@ -60,16 +60,29 @@ namespace OpenRA.Mods.Common.Activities
this.minRange = minRange;
}
public static void FlyTick(Actor self, Aircraft aircraft, WAngle desiredFacing, WDist desiredAltitude, WVec moveOverride, WAngle? turnSpeedOverride = null)
public static void FlyTick(Actor self, Aircraft aircraft, WAngle desiredFacing, WDist desiredAltitude, WVec moveOverride, bool idleTurn = false)
{
var dat = self.World.Map.DistanceAboveTerrain(aircraft.CenterPosition);
var move = aircraft.Info.CanSlide ? aircraft.FlyStep(desiredFacing) : aircraft.FlyStep(aircraft.Facing);
if (moveOverride != WVec.Zero)
move = moveOverride;
var turnSpeed = turnSpeedOverride ?? aircraft.TurnSpeed;
var oldFacing = aircraft.Facing;
var turnSpeed = idleTurn ? aircraft.IdleTurnSpeed ?? aircraft.TurnSpeed : aircraft.TurnSpeed;
aircraft.Facing = Util.TickFacing(aircraft.Facing, desiredFacing, turnSpeed);
var roll = idleTurn ? aircraft.Info.IdleRoll ?? aircraft.Info.Roll : aircraft.Info.Roll;
if (roll != WAngle.Zero)
{
var desiredRoll = aircraft.Facing == desiredFacing ? WAngle.Zero :
new WAngle(roll.Angle * Util.GetTurnDirection(aircraft.Facing, oldFacing));
aircraft.Roll = Util.TickFacing(aircraft.Roll, desiredRoll, aircraft.Info.RollSpeed);
}
if (aircraft.Info.Pitch != WAngle.Zero)
aircraft.Pitch = Util.TickFacing(aircraft.Pitch, aircraft.Info.Pitch, aircraft.Info.PitchSpeed);
// Note: we assume that if move.Z is not zero, it's intentional and we want to move in that vertical direction instead of towards desiredAltitude.
// If that is not desired, the place that calls this should make sure moveOverride.Z is zero.
if (dat != desiredAltitude || move.Z != 0)
@@ -83,18 +96,18 @@ namespace OpenRA.Mods.Common.Activities
aircraft.SetPosition(self, aircraft.CenterPosition + move);
}
public static void FlyTick(Actor self, Aircraft aircraft, WAngle desiredFacing, WDist desiredAltitude, WAngle? turnSpeedOverride = null)
public static void FlyTick(Actor self, Aircraft aircraft, WAngle desiredFacing, WDist desiredAltitude, bool idleTurn = false)
{
FlyTick(self, aircraft, desiredFacing, desiredAltitude, WVec.Zero, turnSpeedOverride);
FlyTick(self, aircraft, desiredFacing, desiredAltitude, WVec.Zero, idleTurn);
}
// Should only be used for vertical-only movement, usually VTOL take-off or land. Terrain-induced altitude changes should always be handled by FlyTick.
public static bool VerticalTakeOffOrLandTick(Actor self, Aircraft aircraft, WAngle desiredFacing, WDist desiredAltitude, WAngle? turnSpeedOverride = null)
public static bool VerticalTakeOffOrLandTick(Actor self, Aircraft aircraft, WAngle desiredFacing, WDist desiredAltitude, bool idleTurn = false)
{
var dat = self.World.Map.DistanceAboveTerrain(aircraft.CenterPosition);
var move = WVec.Zero;
var turnSpeed = turnSpeedOverride ?? aircraft.TurnSpeed;
var turnSpeed = idleTurn ? aircraft.IdleTurnSpeed ?? aircraft.TurnSpeed : aircraft.TurnSpeed;
aircraft.Facing = Util.TickFacing(aircraft.Facing, desiredFacing, turnSpeed);
if (dat != desiredAltitude)

View File

@@ -20,16 +20,16 @@ namespace OpenRA.Mods.Common.Activities
{
readonly Aircraft aircraft;
readonly INotifyIdle[] tickIdles;
readonly WAngle turnSpeed;
readonly bool idleTurn;
int remainingTicks;
public FlyIdle(Actor self, int ticks = -1, bool tickIdle = true)
public FlyIdle(Actor self, int ticks = -1, bool idleTurn = true)
{
aircraft = self.Trait<Aircraft>();
turnSpeed = aircraft.IdleTurnSpeed ?? aircraft.TurnSpeed;
remainingTicks = ticks;
this.idleTurn = idleTurn;
if (tickIdle)
if (idleTurn)
tickIdles = self.TraitsImplementing<INotifyIdle>().ToArray();
}
@@ -55,7 +55,7 @@ namespace OpenRA.Mods.Common.Activities
// We can't possibly turn this fast
var desiredFacing = aircraft.Facing + new WAngle(256);
Fly.FlyTick(self, aircraft, desiredFacing, aircraft.Info.CruiseAltitude, move, turnSpeed);
Fly.FlyTick(self, aircraft, desiredFacing, aircraft.Info.CruiseAltitude, move, idleTurn);
}
return false;