diff --git a/OpenRa.Game/OpenRa.Game.csproj b/OpenRa.Game/OpenRa.Game.csproj index 9d3a831fdb..4f0bfbeb1e 100644 --- a/OpenRa.Game/OpenRa.Game.csproj +++ b/OpenRa.Game/OpenRa.Game.csproj @@ -142,6 +142,7 @@ + diff --git a/OpenRa.Game/Traits/Activities/Rearm.cs b/OpenRa.Game/Traits/Activities/Rearm.cs new file mode 100644 index 0000000000..154334fb13 --- /dev/null +++ b/OpenRa.Game/Traits/Activities/Rearm.cs @@ -0,0 +1,28 @@ +namespace OpenRa.Game.Traits.Activities +{ + class Rearm : IActivity + { + public IActivity NextActivity { get; set; } + bool isCanceled; + int remainingTicks = ticksPerPip; + + const int ticksPerPip = 25 * 2; + + public IActivity Tick(Actor self) + { + if (isCanceled) return NextActivity; + var limitedAmmo = self.traits.GetOrDefault(); + if (limitedAmmo == null) return NextActivity; + + if (--remainingTicks == 0) + { + if (!limitedAmmo.GiveAmmo()) return NextActivity; + remainingTicks = ticksPerPip; + } + + return this; + } + + public void Cancel(Actor self) { isCanceled = true; NextActivity = null; } + } +} diff --git a/OpenRa.Game/Traits/Activities/ReturnToBase.cs b/OpenRa.Game/Traits/Activities/ReturnToBase.cs index a67fbe21e1..69b7477bec 100644 --- a/OpenRa.Game/Traits/Activities/ReturnToBase.cs +++ b/OpenRa.Game/Traits/Activities/ReturnToBase.cs @@ -25,7 +25,7 @@ namespace OpenRa.Game.Traits.Activities Actor ChooseAirfield(Actor self) { var airfield = Game.world.Actors - .Where(a => a.Info == Rules.UnitInfo["AFLD"] + .Where(a => a.Info == Rules.UnitInfo["AFLD"] /* todo: generalize this */ && a.Owner == self.Owner && !IsReserved(a)) .FirstOrDefault(); @@ -92,7 +92,8 @@ namespace OpenRa.Game.Traits.Activities new Fly(w1), new Fly(w2), new Fly(w3), - new Land(landPoint)); + new Land(landPoint), + NextActivity); } public void Cancel(Actor self) { isCanceled = true; NextActivity = null; } diff --git a/OpenRa.Game/Traits/AttackPlane.cs b/OpenRa.Game/Traits/AttackPlane.cs index 185bd7bf70..05fad7ecb8 100644 --- a/OpenRa.Game/Traits/AttackPlane.cs +++ b/OpenRa.Game/Traits/AttackPlane.cs @@ -11,6 +11,7 @@ namespace OpenRa.Game.Traits target = order.TargetActor; self.QueueActivity(new FlyAttack(order.TargetActor)); self.QueueActivity(new ReturnToBase(self, null)); + self.QueueActivity(new Rearm()); } } } diff --git a/OpenRa.Game/Traits/LimitedAmmo.cs b/OpenRa.Game/Traits/LimitedAmmo.cs index 6b52c72471..2a1a938450 100644 --- a/OpenRa.Game/Traits/LimitedAmmo.cs +++ b/OpenRa.Game/Traits/LimitedAmmo.cs @@ -14,6 +14,12 @@ namespace OpenRa.Game.Traits } public bool HasAmmo() { return ammo > 0; } + public bool GiveAmmo() + { + if (ammo >= self.Info.Ammo) return false; + ++ammo; + return true; + } public void Attacking(Actor self) { --ammo; } diff --git a/OpenRa.Game/Traits/Plane.cs b/OpenRa.Game/Traits/Plane.cs index c4f7de0772..5a41c22cf4 100644 --- a/OpenRa.Game/Traits/Plane.cs +++ b/OpenRa.Game/Traits/Plane.cs @@ -44,6 +44,7 @@ namespace OpenRa.Game.Traits self.CancelActivity(); self.QueueActivity(new Fly(Util.CenterOfCell(order.TargetLocation))); self.QueueActivity(new ReturnToBase(self, null)); + self.QueueActivity(new Rearm()); } if (order.OrderString == "Enter") @@ -57,6 +58,7 @@ namespace OpenRa.Game.Traits self.CancelActivity(); self.QueueActivity(new ReturnToBase(self, order.TargetActor)); + self.QueueActivity(new Rearm()); /* todo: something else when it's FIX rather than AFLD */ } }