diff --git a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj
index c30434bafd..8882290532 100644
--- a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj
+++ b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj
@@ -496,7 +496,7 @@
-
+
diff --git a/OpenRA.Mods.Common/Traits/Upgrades/GrantConditionOnMovement.cs b/OpenRA.Mods.Common/Traits/Upgrades/GrantConditionOnMovement.cs
new file mode 100644
index 0000000000..b9137d48c1
--- /dev/null
+++ b/OpenRA.Mods.Common/Traits/Upgrades/GrantConditionOnMovement.cs
@@ -0,0 +1,62 @@
+#region Copyright & License Information
+/*
+ * Copyright 2007-2016 The OpenRA Developers (see AUTHORS)
+ * This file is part of OpenRA, which is free software. It is made
+ * available to you under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version. For more
+ * information, see COPYING.
+ */
+#endregion
+
+using System.Linq;
+using OpenRA.Traits;
+
+namespace OpenRA.Mods.Common.Traits
+{
+ public class GrantConditionOnMovementInfo : UpgradableTraitInfo, Requires
+ {
+ [FieldLoader.Require]
+ [UpgradeGrantedReference]
+ [Desc("Condition to grant.")]
+ public readonly string Condition = null;
+
+ [Desc("Apply upgrades on straight vertical movement as well.")]
+ public readonly bool ConsiderVerticalMovement = false;
+
+ public override object Create(ActorInitializer init) { return new GrantConditionOnMovement(init.Self, this); }
+ }
+
+ public class GrantConditionOnMovement : UpgradableTrait, ITick
+ {
+ readonly IMove movement;
+
+ UpgradeManager manager;
+ int conditionToken = UpgradeManager.InvalidConditionToken;
+
+ public GrantConditionOnMovement(Actor self, GrantConditionOnMovementInfo info)
+ : base(info)
+ {
+ movement = self.Trait();
+ }
+
+ protected override void Created(Actor self)
+ {
+ manager = self.TraitOrDefault();
+ base.Created(self);
+ }
+
+ void ITick.Tick(Actor self)
+ {
+ if (manager == null)
+ return;
+
+ var isMovingVertically = Info.ConsiderVerticalMovement ? movement.IsMovingVertically : false;
+ var isMoving = !IsTraitDisabled && !self.IsDead && (movement.IsMoving || isMovingVertically);
+ if (isMoving && conditionToken == UpgradeManager.InvalidConditionToken)
+ conditionToken = manager.GrantCondition(self, Info.Condition);
+ else if (!isMoving && conditionToken != UpgradeManager.InvalidConditionToken)
+ conditionToken = manager.RevokeCondition(self, conditionToken);
+ }
+ }
+}
diff --git a/OpenRA.Mods.Common/Traits/Upgrades/UpgradeOnMovement.cs b/OpenRA.Mods.Common/Traits/Upgrades/UpgradeOnMovement.cs
deleted file mode 100644
index a39e9eacae..0000000000
--- a/OpenRA.Mods.Common/Traits/Upgrades/UpgradeOnMovement.cs
+++ /dev/null
@@ -1,75 +0,0 @@
-#region Copyright & License Information
-/*
- * Copyright 2007-2016 The OpenRA Developers (see AUTHORS)
- * This file is part of OpenRA, which is free software. It is made
- * available to you under the terms of the GNU General Public License
- * as published by the Free Software Foundation, either version 3 of
- * the License, or (at your option) any later version. For more
- * information, see COPYING.
- */
-#endregion
-
-using System.Linq;
-using OpenRA.Traits;
-
-namespace OpenRA.Mods.Common.Traits
-{
- public class UpgradeOnMovementInfo : UpgradableTraitInfo, Requires, Requires
- {
- [UpgradeGrantedReference, FieldLoader.Require]
- [Desc("The upgrades to grant.")]
- public readonly string[] Upgrades = { };
-
- [Desc("Apply upgrades on straight vertical movement as well.")]
- public readonly bool ConsiderVerticalMovement = false;
-
- public override object Create(ActorInitializer init) { return new UpgradeOnMovement(init.Self, this); }
- }
-
- public class UpgradeOnMovement : UpgradableTrait, ITick
- {
- readonly UpgradeManager manager;
- readonly IMove movement;
-
- bool granted;
-
- public UpgradeOnMovement(Actor self, UpgradeOnMovementInfo info)
- : base(info)
- {
- manager = self.Trait();
- movement = self.Trait();
- }
-
- void Revoke(Actor self)
- {
- if (!granted)
- return;
-
- foreach (var up in Info.Upgrades)
- manager.RevokeUpgrade(self, up, this);
-
- granted = false;
- }
-
- void ITick.Tick(Actor self)
- {
- if (IsTraitDisabled)
- {
- Revoke(self);
- return;
- }
-
- var isMovingVertically = Info.ConsiderVerticalMovement ? movement.IsMovingVertically : false;
- var isMoving = !self.IsDead && (movement.IsMoving || isMovingVertically);
- if (isMoving && !granted)
- {
- foreach (var up in Info.Upgrades)
- manager.GrantUpgrade(self, up, this);
-
- granted = true;
- }
- else if (!isMoving)
- Revoke(self);
- }
- }
-}
diff --git a/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs b/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs
index d01f943186..dc006bcb64 100644
--- a/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs
+++ b/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs
@@ -623,6 +623,12 @@ namespace OpenRA.Mods.Common.UtilityCommands
RenameNodeKey(node, "GrantConditionOnDamageState");
ConvertUpgradesToCondition(parent, node, "Upgrades", "Condition");
}
+
+ if (node.Key.StartsWith("UpgradeOnMovement", StringComparison.Ordinal))
+ {
+ RenameNodeKey(node, "GrantConditionOnMovement");
+ ConvertUpgradesToCondition(parent, node, "Upgrades", "Condition");
+ }
}
UpgradeActorRules(modData, engineVersion, ref node.Value.Nodes, node, depth + 1);