Let order generators account for selection changes

This commit is contained in:
abcdefg30
2020-05-22 11:21:57 +02:00
committed by Paul Chote
parent b5e3f25418
commit 07d58337f1
12 changed files with 63 additions and 24 deletions

View File

@@ -25,7 +25,6 @@ namespace OpenRA.Mods.Common.Orders
yield return new Order("PlaceBeacon", world.LocalPlayer.PlayerActor, Target.FromCell(world, cell), false) { SuppressVisualFeedback = true };
}
protected override void Tick(World world) { }
protected override IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; }
protected override IEnumerable<IRenderable> RenderAboveShroud(WorldRenderer wr, World world) { yield break; }
protected override IEnumerable<IRenderable> RenderAnnotations(WorldRenderer wr, World world) { yield break; }

View File

@@ -28,29 +28,31 @@ namespace OpenRA.Mods.Common.Orders
yield break;
var target = FriendlyGuardableUnits(world, mi).FirstOrDefault();
if (target == null || Subjects.All(s => s.IsDead))
if (target == null)
yield break;
world.CancelInputMode();
var queued = mi.Modifiers.HasModifier(Modifiers.Shift);
yield return new Order(OrderName, null, Target.FromActor(target), queued, null, Subjects.Where(s => s != target).ToArray());
yield return new Order(OrderName, null, Target.FromActor(target), queued, null, subjects.Where(s => s != target).ToArray());
}
public override void Tick(World world)
public override void SelectionChanged(World world, IEnumerable<Actor> selected)
{
if (Subjects.All(s => s.IsDead || !s.Info.HasTraitInfo<GuardInfo>()))
// Guarding doesn't work without AutoTarget, so require at least one unit in the selection to have it
subjects = selected.Where(s => s.Info.HasTraitInfo<GuardInfo>());
if (!subjects.Any(s => s.Info.HasTraitInfo<AutoTargetInfo>()))
world.CancelInputMode();
}
public override string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi)
{
if (!Subjects.Any())
if (!subjects.Any())
return null;
var multiple = Subjects.Count() > 1;
var multiple = subjects.Count() > 1;
var canGuard = FriendlyGuardableUnits(world, mi)
.Any(a => multiple || a != Subjects.First());
.Any(a => multiple || a != subjects.First());
return canGuard ? Cursor : "move-blocked";
}

View File

@@ -32,12 +32,14 @@ namespace OpenRA.Mods.Common.Orders
string IOrderGenerator.GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi) { return GetCursor(world, cell, worldPixel, mi); }
void IOrderGenerator.Deactivate() { }
bool IOrderGenerator.HandleKeyPress(KeyInput e) { return false; }
void IOrderGenerator.SelectionChanged(World world, IEnumerable<Actor> selected) { SelectionChanged(world, selected); }
protected abstract void Tick(World world);
protected virtual void Tick(World world) { }
protected abstract IEnumerable<IRenderable> Render(WorldRenderer wr, World world);
protected abstract IEnumerable<IRenderable> RenderAboveShroud(WorldRenderer wr, World world);
protected abstract IEnumerable<IRenderable> RenderAnnotations(WorldRenderer wr, World world);
protected abstract string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi);
protected abstract IEnumerable<Order> OrderInner(World world, CPos cell, int2 worldPixel, MouseInput mi);
protected virtual void SelectionChanged(World world, IEnumerable<Actor> selected) { }
}
}

View File

@@ -222,6 +222,8 @@ namespace OpenRA.Mods.Common.Orders
v.Preview.Tick();
}
void IOrderGenerator.SelectionChanged(World world, IEnumerable<Actor> selected) { }
bool AcceptsPlug(CPos cell, PlugInfo plug)
{
var host = buildingInfluence.GetBuildingAt(cell);