unhacking a hack

This commit is contained in:
Chris Forbes
2010-01-02 12:34:33 +13:00
parent a2a00ae599
commit 802e60b847
3 changed files with 43 additions and 21 deletions

View File

@@ -19,6 +19,12 @@ namespace OpenRa.Game
public Controller(Func<Modifiers> getModifierKeys)
{
GetModifierKeys = getModifierKeys;
CancelInputMode();
}
public void CancelInputMode()
{
orderGenerator = new UnitOrderGenerator(new Actor[] { });
}
List<Order> recentOrders = new List<Order>();
@@ -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;
}

View File

@@ -173,6 +173,7 @@ namespace OpenRa.Game
public int2 Location;
public MouseButton Button;
public Modifiers Modifiers;
public bool IsFake;
}
enum MouseInputEvent { Down, Move, Up };

View File

@@ -16,33 +16,38 @@ namespace OpenRa.Game.Orders
public IEnumerable<Order> 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<Traits.ProductionQueue>().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()