diff --git a/OpenRa.Game/OpenRa.Game.csproj b/OpenRa.Game/OpenRa.Game.csproj
index 80e5bc199f..c4148588d1 100644
--- a/OpenRa.Game/OpenRa.Game.csproj
+++ b/OpenRa.Game/OpenRa.Game.csproj
@@ -162,6 +162,7 @@
+
@@ -255,6 +256,7 @@
+
diff --git a/OpenRa.Game/Orders/UnitOrderGenerator.cs b/OpenRa.Game/Orders/UnitOrderGenerator.cs
index dc4019ceea..95ad375bbb 100644
--- a/OpenRa.Game/Orders/UnitOrderGenerator.cs
+++ b/OpenRa.Game/Orders/UnitOrderGenerator.cs
@@ -86,6 +86,7 @@ namespace OpenRa.Game.Orders
case "Infiltrate": return Cursor.Enter;
case "Capture": return Cursor.Capture;
case "Harvest": return Cursor.AttackMove;
+ case "Steal" : return Cursor.Enter;
default:
return null;
}
diff --git a/OpenRa.Game/Traits/Activities/StealOre.cs b/OpenRa.Game/Traits/Activities/StealOre.cs
new file mode 100644
index 0000000000..9b343e1e30
--- /dev/null
+++ b/OpenRa.Game/Traits/Activities/StealOre.cs
@@ -0,0 +1,35 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace OpenRa.Game.Traits.Activities
+{
+ class StealOre : IActivity
+ {
+ Actor target;
+ public const int CashStolen = 100; //todo: push this out to Rules
+
+ public StealOre(Actor target) { this.target = target; }
+
+ public IActivity NextActivity { get; set; }
+
+ public IActivity Tick(Actor self)
+ {
+ if (target == null || target.IsDead) return NextActivity;
+
+ if (target.Owner == self.Owner) return NextActivity;
+
+ target.Owner.TakeCash(CashStolen);
+ self.Owner.GiveCash(CashStolen);
+
+ // the thief is sacrificed.
+ self.Health = 0;
+ Game.world.AddFrameEndTask(w => w.Remove(self));
+
+ return NextActivity;
+ }
+
+ public void Cancel(Actor self) { target = null; NextActivity = null; }
+ }
+}
diff --git a/OpenRa.Game/Traits/ThiefSteal.cs b/OpenRa.Game/Traits/ThiefSteal.cs
new file mode 100644
index 0000000000..4b3f016c26
--- /dev/null
+++ b/OpenRa.Game/Traits/ThiefSteal.cs
@@ -0,0 +1,30 @@
+using OpenRa.Game.Traits.Activities;
+
+namespace OpenRa.Game.Traits
+{
+ class ThiefSteal : IOrder
+ {
+ public ThiefSteal(Actor self) { }
+
+ public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor)
+ {
+ if (mi.Button != MouseButton.Right) return null;
+ if (underCursor == null) return null;
+ if (!underCursor.traits.Contains()) return null;
+
+ // todo: other bits
+
+ return new Order("Steal", self, underCursor, int2.Zero, null);
+ }
+
+ public void ResolveOrder(Actor self, Order order)
+ {
+ if (order.OrderString == "Steal")
+ {
+ self.CancelActivity();
+ self.QueueActivity(new Move(order.TargetActor, 1));
+ self.QueueActivity(new StealOre(order.TargetActor));
+ }
+ }
+ }
+}