Skip to content

Commit

Permalink
Allow queueing up scatter and move Nudge to an activity
Browse files Browse the repository at this point in the history
  • Loading branch information
PunkPun authored and Mailaender committed Aug 8, 2023
1 parent 54dac39 commit 3ab421c
Show file tree
Hide file tree
Showing 8 changed files with 86 additions and 41 deletions.
2 changes: 1 addition & 1 deletion OpenRA.Mods.Cnc/Traits/MadTank.cs
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,7 @@ void EjectDriver()
new LocationInit(self.Location),
new OwnerInit(self.Owner)
});
driver.TraitOrDefault<Mobile>()?.Nudge(driver);
driver.QueueActivity(false, new Nudge(driver));
}
}
}
Expand Down
66 changes: 66 additions & 0 deletions OpenRA.Mods.Common/Activities/Move/Nudge.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
#region Copyright & License Information
/*
* Copyright (c) The OpenRA Developers and Contributors
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version. For more
* information, see COPYING.
*/
#endregion

using System.Collections.Generic;
using OpenRA.Activities;
using OpenRA.Mods.Common.Activities;
using OpenRA.Traits;

namespace OpenRA.Mods.Common.Traits
{
public class Nudge : Activity
{
readonly Actor nudger;
public Nudge(Actor nudger)
{
this.nudger = nudger;
}

protected override void OnFirstRun(Actor self)
{
var move = self.Trait<IMove>();
if (move is Mobile mobile)
{
if (mobile.IsTraitDisabled || mobile.IsTraitPaused || mobile.IsImmovable)
return;

var cell = mobile.GetAdjacentCell(nudger.Location);
if (cell != null)
QueueChild(mobile.MoveTo(cell.Value, 0, targetLineColor: mobile.Info.TargetLineColor));
}
else if (move is Aircraft aircraft)
{
if (aircraft.IsTraitDisabled || aircraft.IsTraitPaused || aircraft.RequireForceMove)
return;

// Disable nudging if the aircraft is outside the map.
if (!self.World.Map.Contains(self.Location))
return;

var offset = new WVec(0, -self.World.SharedRandom.Next(512, 2048), 0)
.Rotate(WRot.FromFacing(self.World.SharedRandom.Next(256)));

var target = Target.FromPos(self.CenterPosition + offset);
QueueChild(new Fly(self, target, targetLineColor: aircraft.Info.TargetLineColor));
aircraft.UnReserve();
}
}

public override IEnumerable<TargetLineNode> TargetLineNodes(Actor self)
{
if (ChildActivity != null)
foreach (var n in ChildActivity.TargetLineNodes(self))
yield return n;

yield break;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ public void MoveIntoWorld(CPos cell)
[Desc("Leave the current position in a random direction.")]
public void Scatter()
{
mobile.Nudge(Self);
Self.QueueActivity(false, new Nudge(Self));
}

[ScriptActorPropertyActivity]
Expand Down
31 changes: 8 additions & 23 deletions OpenRA.Mods.Common/Traits/Air/Aircraft.cs
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,7 @@ public WAngle GetTurnSpeed(bool isIdleTurn)
public bool ForceLanding { get; private set; }

(CPos, SubCell)[] landingCells = Array.Empty<(CPos, SubCell)>();
bool requireForceMove;
public bool RequireForceMove;

readonly int creationActivityDelay;

Expand Down Expand Up @@ -354,7 +354,7 @@ public override IEnumerable<VariableObserver> GetVariableObservers()

void RequireForceMoveConditionChanged(Actor self, IReadOnlyDictionary<string, int> conditions)
{
requireForceMove = Info.RequireForceMoveCondition.Evaluate(conditions);
RequireForceMove = Info.RequireForceMoveCondition.Evaluate(conditions);
}

protected override void Created(Actor self)
Expand Down Expand Up @@ -586,7 +586,7 @@ public void UnReserve()

bool AircraftCanEnter(Actor a, TargetModifiers modifiers)
{
if (requireForceMove && !modifiers.HasModifier(TargetModifiers.ForceMove))
if (RequireForceMove && !modifiers.HasModifier(TargetModifiers.ForceMove))
return false;

return AircraftCanEnter(a);
Expand Down Expand Up @@ -1144,29 +1144,14 @@ public void ResolveOrder(Actor self, Order order)
self.ShowTargetLines();
}
else if (orderString == "Scatter")
Nudge(self);
{
self.QueueActivity(order.Queued, new Nudge(self));
self.ShowTargetLines();
}
}

#endregion

void Nudge(Actor self)
{
if (IsTraitDisabled || IsTraitPaused || requireForceMove)
return;

// Disable nudging if the aircraft is outside the map
if (!self.World.Map.Contains(self.Location))
return;

var offset = new WVec(0, -self.World.SharedRandom.Next(512, 2048), 0)
.Rotate(WRot.FromFacing(self.World.SharedRandom.Next(256)));
var target = Target.FromPos(self.CenterPosition + offset);

self.QueueActivity(false, new Fly(self, target));
self.ShowTargetLines();
UnReserve();
}

#region Airborne conditions

void OnAirborneAltitudeReached()
Expand Down Expand Up @@ -1295,7 +1280,7 @@ public bool TargetOverridesSelection(Actor self, in Target target, List<Actor> a

public virtual bool CanTarget(Actor self, in Target target, ref TargetModifiers modifiers, ref string cursor)
{
if (target.Type != TargetType.Terrain || (aircraft.requireForceMove && !modifiers.HasModifier(TargetModifiers.ForceMove)))
if (target.Type != TargetType.Terrain || (aircraft.RequireForceMove && !modifiers.HasModifier(TargetModifiers.ForceMove)))
return false;

var location = self.World.Map.CellContaining(target.CenterPosition);
Expand Down
2 changes: 1 addition & 1 deletion OpenRA.Mods.Common/Traits/Crushable.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ void INotifyCrushed.WarnCrush(Actor self, Actor crusher, BitSet<CrushClass> crus

var mobile = self.TraitOrDefault<Mobile>();
if (mobile != null && self.World.SharedRandom.Next(100) <= Info.WarnProbability)
mobile.Nudge(crusher);
self.QueueActivity(false, new Nudge(crusher));
}

void INotifyCrushed.OnCrush(Actor self, Actor crusher, BitSet<CrushClass> crushClasses)
Expand Down
2 changes: 1 addition & 1 deletion OpenRA.Mods.Common/Traits/EjectOnDeath.cs
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ void INotifyKilled.Killed(Actor self, AttackInfo e)
var pilot = self.World.CreateActor(true, Info.PilotActor.ToLowerInvariant(), td);
if (!inAir)
pilot.TraitOrDefault<Mobile>()?.Nudge(pilot);
pilot.QueueActivity(false, new Nudge(pilot));
else
Game.Sound.Play(SoundType.World, Info.ChuteSound, cp);
});
Expand Down
17 changes: 5 additions & 12 deletions OpenRA.Mods.Common/Traits/Mobile.cs
Original file line number Diff line number Diff line change
Expand Up @@ -367,16 +367,6 @@ protected override void TraitPaused(Actor self)

#region Local misc stuff

public void Nudge(Actor nudger)
{
if (IsTraitDisabled || IsTraitPaused || IsImmovable)
return;

var cell = GetAdjacentCell(nudger.Location);
if (cell != null)
self.QueueActivity(false, MoveTo(cell.Value, 0));
}

public CPos? GetAdjacentCell(CPos nextCell, Func<CPos, bool> preferToAvoid = null)
{
var availCells = new List<CPos>();
Expand Down Expand Up @@ -873,7 +863,7 @@ void INotifyBlockingMove.OnNotifyBlockingMove(Actor self, Actor blocking)

if (self.IsIdle)
{
Nudge(blocking);
self.QueueActivity(false, new Nudge(blocking));
return;
}

Expand Down Expand Up @@ -942,7 +932,10 @@ void IResolveOrder.ResolveOrder(Actor self, Order order)
else if (order.OrderString == "Stop")
self.CancelActivity();
else if (order.OrderString == "Scatter")
Nudge(self);
{
self.QueueActivity(order.Queued, new Nudge(self));
self.ShowTargetLines();
}
}

string IOrderVoice.VoicePhraseForOrder(Actor self, Order order)
Expand Down
5 changes: 3 additions & 2 deletions OpenRA.Mods.Common/Widgets/Logic/Ingame/CommandBarLogic.cs
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,8 @@ void Toggle(bool allowCancel)
if (highlightOnButtonPress)
scatterHighlighted = 2;
PerformKeyboardOrderOnSelection(a => new Order("Scatter", a, false));
var queued = Game.GetModifierKeys().HasModifier(Modifiers.Shift);
PerformKeyboardOrderOnSelection(a => new Order("Scatter", a, queued));
};

scatterButton.OnKeyPress = ki => { scatterHighlighted = 2; scatterButton.OnClick(); };
Expand Down Expand Up @@ -211,7 +212,7 @@ void Toggle(bool allowCancel)
var keyOverrides = widget.GetOrNull<LogicKeyListenerWidget>("MODIFIER_OVERRIDES");
if (keyOverrides != null)
{
var noShiftButtons = new[] { guardButton, deployButton, attackMoveButton };
var noShiftButtons = new[] { guardButton, deployButton, scatterButton, attackMoveButton };
var keyUpButtons = new[] { guardButton, attackMoveButton };
keyOverrides.AddHandler(e =>
{
Expand Down

0 comments on commit 3ab421c

Please sign in to comment.