diff --git a/OpenRa.Game/OpenRa.Game.csproj b/OpenRa.Game/OpenRa.Game.csproj
index 0d210d7912..bae8b5e563 100644
--- a/OpenRa.Game/OpenRa.Game.csproj
+++ b/OpenRa.Game/OpenRa.Game.csproj
@@ -1,4 +1,4 @@
-
+
Debug
AnyCPU
@@ -184,6 +184,7 @@
+
@@ -266,4 +267,4 @@
-->
-
\ No newline at end of file
+
diff --git a/OpenRa.Game/Traits/AttackBase.cs b/OpenRa.Game/Traits/AttackBase.cs
index 2253655437..041b9a8f74 100644
--- a/OpenRa.Game/Traits/AttackBase.cs
+++ b/OpenRa.Game/Traits/AttackBase.cs
@@ -91,6 +91,11 @@ namespace OpenRa.Game.Traits
bool CheckFire(Actor self, Unit unit, string weaponName, ref int fireDelay, int[] offset, ref int burst)
{
if (fireDelay > 0) return false;
+
+ var limitedAmmo = self.traits.GetOrDefault();
+ if (!limitedAmmo.HasAmmo())
+ return false;
+
var weapon = Rules.WeaponInfo[weaponName];
if (weapon.Range * weapon.Range < (target.Location - self.Location).LengthSquared) return false;
diff --git a/OpenRa.Game/Traits/LimitedAmmo.cs b/OpenRa.Game/Traits/LimitedAmmo.cs
new file mode 100644
index 0000000000..c032032376
--- /dev/null
+++ b/OpenRa.Game/Traits/LimitedAmmo.cs
@@ -0,0 +1,29 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace OpenRa.Game.Traits
+{
+ class LimitedAmmo : INotifyAttack, IPips
+ {
+ int ammo;
+ Actor self;
+
+ public LimitedAmmo(Actor self)
+ {
+ ammo = self.Info.Ammo;
+ this.self = self;
+ }
+
+ public bool HasAmmo() { return ammo > 0; }
+
+ public void Attacking(Actor self) { --ammo; }
+
+ public IEnumerable GetPips()
+ {
+ return Graphics.Util.MakeArray(self.Info.Ammo,
+ i => ammo > i ? PipType.Green : PipType.Transparent);
+ }
+ }
+}
diff --git a/units.ini b/units.ini
index dd3807c0bc..ac5535c250 100755
--- a/units.ini
+++ b/units.ini
@@ -165,13 +165,13 @@ HIND
[MIG]
Description=Mig Attack Plane
BuiltAt=afld
-Traits=Unit, Plane, RenderUnit, WithShadow
+Traits=Unit, Plane, RenderUnit, WithShadow, LimitedAmmo
InitialFacing=192
LongDesc=Fast Ground-Attack Plane.\n Strong vs Buildings\n Weak vs Infantry, Light Vehicles
[YAK]
Description=Yak Attack Plane
BuiltAt=afld
-Traits=Unit, Plane, RenderUnit, WithShadow
+Traits=Unit, Plane, RenderUnit, WithShadow, LimitedAmmo
InitialFacing=192
LongDesc=Anti-Tanks & Anti-Infantry Plane.\n Strong vs Infantry, Tanks\n Weak vs Buildings
[TRAN]
@@ -185,14 +185,14 @@ LongDesc=Fast Infantry Transport Helicopter.\n Unarmed
[HELI]
Description=Longbow
BuiltAt=hpad
-Traits=Unit, Helicopter, RenderUnitRotor, WithShadow
+Traits=Unit, Helicopter, RenderUnitRotor, WithShadow, LimitedAmmo
PrimaryOffset=0,0,0,-2
InitialFacing=20
LongDesc=Helicopter Gunship with AG Missiles.\n Strong vs Buildings, Tanks\n Weak vs Infantry
[HIND]
Description=Hind
BuiltAt=hpad
-Traits=Unit, Helicopter, RenderUnitRotor, WithShadow
+Traits=Unit, Helicopter, RenderUnitRotor, WithShadow, LimitedAmmo
InitialFacing=20
LongDesc=Helicopter Gunship with Chainguns.\n Strong vs Infantry, Light Vehicles.\n Weak vs Tanks