Files
OpenRA/OpenRA.Mods.RA/Widgets/WorldCommandWidget.cs
2010-11-13 17:44:45 +13:00

116 lines
3.0 KiB
C#

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 HoldFireKey = '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<UnitStanceHoldGround>();
}
// command: AggressiveStance
if (e.KeyChar == AggressiveKey && (e.Modifiers.HasModifier(Modifiers.Alt)))
{
return EnableStance<UnitStanceAggressive>();
}
// 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<UnitStanceReturnFire>();
}
// stance: Hold Fire
// description: Prevents attacking (ie no autotarget is being done)
if (e.KeyChar == HoldFireKey && (e.Modifiers.HasModifier(Modifiers.Alt)))
{
return EnableStance<UnitStanceHoldFire>();
}
// stance: Defensive
if (e.KeyChar == DefensiveKey && (e.Modifiers.HasModifier(Modifiers.Alt)))
{
return EnableStance<UnitStanceDefensive>();
}
return false;
}
private bool EnableStance<T>() 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<T>() != null && !UnitStance.IsActive<T>(a)).
Select(a => new Pair<Actor, T>(a, a.TraitOrDefault<T>()) );
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;
}
}
}