diff --git a/OpenRa.Game/Graphics/WorldRenderer.cs b/OpenRa.Game/Graphics/WorldRenderer.cs index 65032fcacb..9df8b1ea24 100644 --- a/OpenRa.Game/Graphics/WorldRenderer.cs +++ b/OpenRa.Game/Graphics/WorldRenderer.cs @@ -84,6 +84,17 @@ namespace OpenRa.Game.Graphics DrawBandBox(); + + foreach(var a in Game.world.Actors.Where(b => b.Owner == Game.LocalPlayer && b.traits.Contains() && b.traits.Get().IsRepairing())) + { + var bounds = a.GetBounds(true); + + var repairImages = new Animation("select"); + repairImages.PlayRepeating("repair"); + spriteRenderer.DrawSprite(repairImages.Image, new float2(.5f * (bounds.Left + bounds.Right)-12, .5f * (bounds.Top + bounds.Bottom)-11), PaletteType.Chrome); + } + + if (Game.controller.orderGenerator != null) Game.controller.orderGenerator.Render(); diff --git a/OpenRa.Game/Orders/RepairOrderGenerator.cs b/OpenRa.Game/Orders/RepairOrderGenerator.cs index d4c366d1fb..ae168a2e45 100644 --- a/OpenRa.Game/Orders/RepairOrderGenerator.cs +++ b/OpenRa.Game/Orders/RepairOrderGenerator.cs @@ -25,7 +25,7 @@ namespace OpenRa.Game.Orders var building = underCursor != null ? underCursor.Info as BuildingInfo : null; - if (building == null || !building.Repairable) + if (building == null || !building.Repairable || underCursor.Health == building.Strength) { yield return new Order("NoRepair", Game.LocalPlayer.PlayerActor, null, int2.Zero, null); yield break; diff --git a/OpenRa.Game/Traits/Building.cs b/OpenRa.Game/Traits/Building.cs index d102eb3c25..2b2d95a571 100644 --- a/OpenRa.Game/Traits/Building.cs +++ b/OpenRa.Game/Traits/Building.cs @@ -1,11 +1,16 @@ using OpenRa.Game.GameRules; using OpenRa.Game.Traits.Activities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; namespace OpenRa.Game.Traits { - class Building : INotifyDamage, IOrder + class Building : INotifyDamage, IOrder, ITick { public readonly BuildingInfo unitInfo; + bool isRepairing = false; public Building(Actor self) { @@ -32,6 +37,43 @@ namespace OpenRa.Game.Traits self.CancelActivity(); self.QueueActivity(new Sell()); } + + if (order.OrderString == "Repair") + { + isRepairing = !isRepairing; + } + } + + public bool IsRepairing(){ + return isRepairing; + } + + int remainingTicks; + + public void Tick(Actor self) + { + if (!isRepairing) return; + + if (remainingTicks == 0) + { + var costPerHp = (Rules.General.URepairPercent * self.Info.Cost) / self.Info.Strength; + var hpToRepair = Math.Min(Rules.General.URepairStep, self.Info.Strength - self.Health); + var cost = (int)Math.Ceiling(costPerHp * hpToRepair); + if (!self.Owner.TakeCash(cost)) + { + remainingTicks = 1; + } + + self.InflictDamage(self, -hpToRepair, Rules.WarheadInfo["Super"]); + if (self.Health == self.Info.Strength) + { + isRepairing = false; + return; + } + remainingTicks = (int)(Rules.General.RepairRate * 60 * 25); + } + else + --remainingTicks; } } } diff --git a/sequences.xml b/sequences.xml index bc58377d4d..340642858c 100644 --- a/sequences.xml +++ b/sequences.xml @@ -372,7 +372,7 @@ - + @@ -388,7 +388,7 @@ - + @@ -991,4 +991,7 @@ + + + \ No newline at end of file