Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow queueing up scatter and move Nudge to an activity #20493

Merged
merged 1 commit into from
Aug 8, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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();
PunkPun marked this conversation as resolved.
Show resolved Hide resolved
}
}

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