diff --git a/OpenRA.Mods.Common/Activities/Move/Move.cs b/OpenRA.Mods.Common/Activities/Move/Move.cs index 1a447adaf8..ef957a794b 100644 --- a/OpenRA.Mods.Common/Activities/Move/Move.cs +++ b/OpenRA.Mods.Common/Activities/Move/Move.cs @@ -41,6 +41,7 @@ namespace OpenRA.Mods.Common.Activities List path; CPos? destination; + int startTicks; // For dealing with blockers bool hasWaited; @@ -111,6 +112,8 @@ namespace OpenRA.Mods.Common.Activities protected override void OnFirstRun(Actor self) { + startTicks = self.World.WorldTick; + if (evaluateNearestMovableCell && destination.HasValue) { var movableDestination = mobile.NearestMoveableCell(destination.Value); @@ -156,6 +159,10 @@ namespace OpenRA.Mods.Common.Activities return false; var firstFacing = self.World.Map.FacingBetween(mobile.FromCell, nextCell.Value.Cell, mobile.Facing); + + if (mobile.Info.CanMoveBackward && self.World.WorldTick - startTicks < mobile.Info.BackwardDuration && Math.Abs(firstFacing.Angle - mobile.Facing.Angle) > 256) + firstFacing = new WAngle(firstFacing.Angle + 512); + if (firstFacing != mobile.Facing) { path.Add(nextCell.Value.Cell); diff --git a/OpenRA.Mods.Common/Traits/Mobile.cs b/OpenRA.Mods.Common/Traits/Mobile.cs index 9ff0476147..08a2167f7a 100644 --- a/OpenRA.Mods.Common/Traits/Mobile.cs +++ b/OpenRA.Mods.Common/Traits/Mobile.cs @@ -65,6 +65,12 @@ namespace OpenRA.Mods.Common.Traits [Desc("Display order for the facing slider in the map editor")] public readonly int EditorFacingDisplayOrder = 3; + [Desc("Can move backward if possible")] + public readonly bool CanMoveBackward = false; + + [Desc("After how many ticks the actor will turn forward during backoff")] + public readonly int BackwardDuration = 40; + [ConsumedConditionReference] [Desc("Boolean expression defining the condition under which the regular (non-force) move cursor is disabled.")] public readonly BooleanExpression RequireForceMoveCondition = null;