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);