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)); + } + } + } +}