using System; using System.Linq; using OpenRA.FileFormats; using OpenRA.Graphics; using OpenRA.Network; using OpenRA.Orders; using OpenRA.Widgets; namespace OpenRA.Mods.RA.Widgets { public class WorldCommandWidget : Widget { public World World { get { return OrderManager.world; } } public char AttackMoveKey = 'a'; public char HoldGroundKey = 'g'; // Hold (G)round // public char DefensiveKey = 'd'; // (D)efensive public char AggressiveKey = 'a'; // (A)ggressive public char ReturnFireKey = 'r'; // (R)eturn Fire public char HoldFire = 'h'; // (h)old fire public readonly OrderManager OrderManager; [ObjectCreator.UseCtor] public WorldCommandWidget([ObjectCreator.Param] OrderManager orderManager ) { OrderManager = orderManager; } public override void DrawInner(WorldRenderer wr) { } public override string GetCursor(int2 pos) { return null; } public override bool HandleKeyPressInner(KeyInput e) { if (World == null) return false; if (World.LocalPlayer == null) return false; return ProcessInput(e); } private bool ProcessInput(KeyInput e) { // command: AttackMove if (e.KeyChar == AttackMoveKey && e.Modifiers == Modifiers.None) { return PerformAttackMove(); } // command: GuardStance if (e.KeyChar == HoldGroundKey && (e.Modifiers.HasModifier(Modifiers.Alt))) { return EnableStance(); } // command: AggressiveStance if (e.KeyChar == AggressiveKey && (e.Modifiers.HasModifier(Modifiers.Alt))) { return EnableStance(); } // stance: Return Fire // description: Fires only when fired upon, stops firing if no longer under attack if (e.KeyChar == ReturnFireKey && (e.Modifiers.HasModifier(Modifiers.Alt))) { return EnableStance(); } // stance: Hold Fire // description: Prevents attacking (ie no autotarget is being done) if (e.KeyChar == HoldFire && (e.Modifiers.HasModifier(Modifiers.Alt))) { return EnableStance(); } return false; } private bool EnableStance() where T : UnitStance { if (World.Selection.Actors.Count() == 0) return false; var traits = World.Selection.Actors.Where(a => !a.Destroyed && a.Owner == World.LocalPlayer && a.TraitOrDefault() != null && !UnitStance.IsActive(a)). Select(a => new Pair(a, a.TraitOrDefault()) ); World.AddFrameEndTask(w => traits.Do(p => UnitStance.OrderStance(p.First, p.Second))); return traits.Any(); } private bool PerformAttackMove() { if (World.Selection.Actors.Count() > 0) { World.OrderGenerator = new GenericSelectTarget(World.Selection.Actors, "AttackMove", "attackmove", MouseButton.Right); return true; } return false; } } }