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 */
}
}