From 802e60b8472870d25b7f3b491a9417f5b33767ab Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Sat, 2 Jan 2010 12:34:33 +1300 Subject: [PATCH] unhacking a hack --- OpenRa.Game/Controller.cs | 24 ++++++++++-- OpenRa.Game/MainWindow.cs | 1 + .../Orders/PlaceBuildingOrderGenerator.cs | 39 +++++++++++-------- 3 files changed, 43 insertions(+), 21 deletions(-) diff --git a/OpenRa.Game/Controller.cs b/OpenRa.Game/Controller.cs index 875a0950b7..db21e2d006 100644 --- a/OpenRa.Game/Controller.cs +++ b/OpenRa.Game/Controller.cs @@ -19,6 +19,12 @@ namespace OpenRa.Game public Controller(Func getModifierKeys) { GetModifierKeys = getModifierKeys; + CancelInputMode(); + } + + public void CancelInputMode() + { + orderGenerator = new UnitOrderGenerator(new Actor[] { }); } List recentOrders = new List(); @@ -128,13 +134,22 @@ namespace OpenRa.Game public Cursor ChooseCursor() { var mods = GetModifierKeys(); - var c = (orderGenerator is UnitOrderGenerator) ? orderGenerator.Order(dragEnd.ToInt2(), - new MouseInput { Location = (Game.CellSize * dragEnd - Game.viewport.Location).ToInt2(), Button = MouseButton.Right, Modifiers = mods }) + + var mi = new MouseInput { + Location = (Game.CellSize * dragEnd - Game.viewport.Location).ToInt2(), + Button = MouseButton.Right, + Modifiers = mods, + IsFake = true, + }; + + var c = orderGenerator.Order(dragEnd.ToInt2(), mi) .Where(o => o.Validate()) .Select(o => CursorForOrderString(o.OrderString, o.Subject, o.TargetLocation)) - .FirstOrDefault(a => a != null) : null; + .FirstOrDefault(a => a != null); - return c ?? (Game.SelectActorsInBox(Game.CellSize * dragEnd, Game.CellSize * dragEnd).Any() ? Cursor.Select : Cursor.Default); + return c ?? + (Game.SelectActorsInBox(Game.CellSize * dragEnd, Game.CellSize * dragEnd).Any() + ? Cursor.Select : Cursor.Default); } Cursor CursorForOrderString( string s, Actor a, int2 location ) @@ -166,6 +181,7 @@ namespace OpenRa.Game case "Infiltrate": return Cursor.Enter; case "Capture": return Cursor.Capture; case "Harvest": return Cursor.Attack; // TODO: special harvest cursor? + case "PlaceBuilding": return Cursor.Default; default: return null; } diff --git a/OpenRa.Game/MainWindow.cs b/OpenRa.Game/MainWindow.cs index e49f0a60ba..dbd76aacf4 100755 --- a/OpenRa.Game/MainWindow.cs +++ b/OpenRa.Game/MainWindow.cs @@ -173,6 +173,7 @@ namespace OpenRa.Game public int2 Location; public MouseButton Button; public Modifiers Modifiers; + public bool IsFake; } enum MouseInputEvent { Down, Move, Up }; diff --git a/OpenRa.Game/Orders/PlaceBuildingOrderGenerator.cs b/OpenRa.Game/Orders/PlaceBuildingOrderGenerator.cs index 6408529c89..0741eae80a 100644 --- a/OpenRa.Game/Orders/PlaceBuildingOrderGenerator.cs +++ b/OpenRa.Game/Orders/PlaceBuildingOrderGenerator.cs @@ -16,33 +16,38 @@ namespace OpenRa.Game.Orders public IEnumerable Order(int2 xy, MouseInput mi) { - if( mi.Button == MouseButton.Left ) + if (mi.IsFake) { - if (!Game.CanPlaceBuilding(Building, xy, null, true)) - { - Sound.Play("nodeply1.aud"); - yield break; - } + // this order is never actually issued, but it's used for choosing a cursor + yield return new Order("PlaceBuilding", Producer.Owner.PlayerActor, null, xy, Building.Name); + yield break; + } - if (!Game.IsCloseEnoughToBase(Producer.Owner, Building, xy)) - { - Sound.Play("nodeply1.aud"); - yield break; - } + if (mi.Button == MouseButton.Left) + { + if (!Game.CanPlaceBuilding(Building, xy, null, true)) + { + Sound.Play("nodeply1.aud"); + yield break; + } + + if (!Game.IsCloseEnoughToBase(Producer.Owner, Building, xy)) + { + Sound.Play("nodeply1.aud"); + yield break; + } yield return new Order("PlaceBuilding", Producer.Owner.PlayerActor, null, xy, Building.Name); } - else // rmb - { - Game.world.AddFrameEndTask( _ => { Game.controller.orderGenerator = null; } ); - } + else + Game.controller.CancelInputMode(); } public void Tick() { var producing = Producer.traits.Get().CurrentItem( Rules.UnitCategory[ Building.Name ] ); - if( producing == null || producing.Item != Building.Name || producing.RemainingTime != 0 ) - Game.world.AddFrameEndTask( _ => { Game.controller.orderGenerator = null; } ); + if (producing == null || producing.Item != Building.Name || producing.RemainingTime != 0) + Game.controller.CancelInputMode(); } public void Render()