diff --git a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj index 8882290532..c814004268 100644 --- a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj +++ b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj @@ -495,7 +495,7 @@ - + diff --git a/OpenRA.Mods.Common/Traits/Upgrades/GrantConditionOnTerrain.cs b/OpenRA.Mods.Common/Traits/Upgrades/GrantConditionOnTerrain.cs new file mode 100644 index 0000000000..d00d8a581f --- /dev/null +++ b/OpenRA.Mods.Common/Traits/Upgrades/GrantConditionOnTerrain.cs @@ -0,0 +1,67 @@ +#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 GrantConditionOnTerrainInfo : ITraitInfo + { + [FieldLoader.Require] + [UpgradeGrantedReference] + [Desc("Condition to grant.")] + public readonly string Condition = null; + + [FieldLoader.Require] + [Desc("Terrain names to trigger the upgrade.")] + public readonly string[] TerrainTypes = { }; + + public object Create(ActorInitializer init) { return new GrantConditionOnTerrain(init, this); } + } + + public class GrantConditionOnTerrain : INotifyCreated, ITick + { + readonly GrantConditionOnTerrainInfo info; + + UpgradeManager manager; + int conditionToken = UpgradeManager.InvalidConditionToken; + string previousTerrain; + + public GrantConditionOnTerrain(ActorInitializer init, GrantConditionOnTerrainInfo info) + { + this.info = info; + } + + void INotifyCreated.Created(Actor self) + { + manager = self.TraitOrDefault(); + } + + public void Tick(Actor self) + { + if (manager == null) + return; + + var currentTerrain = self.World.Map.GetTerrainInfo(self.Location).Type; + var wantsGranted = info.TerrainTypes.Contains(currentTerrain); + if (currentTerrain != previousTerrain) + { + if (wantsGranted && conditionToken == UpgradeManager.InvalidConditionToken) + conditionToken = manager.GrantCondition(self, info.Condition); + else if (!wantsGranted && conditionToken != UpgradeManager.InvalidConditionToken) + conditionToken = manager.RevokeCondition(self, conditionToken); + } + + previousTerrain = currentTerrain; + } + } +} diff --git a/OpenRA.Mods.Common/Traits/Upgrades/UpgradeOnTerrain.cs b/OpenRA.Mods.Common/Traits/Upgrades/UpgradeOnTerrain.cs deleted file mode 100644 index 3e89ec7ef2..0000000000 --- a/OpenRA.Mods.Common/Traits/Upgrades/UpgradeOnTerrain.cs +++ /dev/null @@ -1,69 +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 UpgradeOnTerrainInfo : ITraitInfo, Requires - { - [UpgradeGrantedReference] - public readonly string[] Upgrades = { "terrain" }; - - [Desc("Terrain names to trigger the upgrade.")] - public readonly string[] TerrainTypes = { }; - - public object Create(ActorInitializer init) { return new UpgradeOnTerrain(init, this); } - } - - public class UpgradeOnTerrain : ITick - { - readonly Actor self; - readonly UpgradeOnTerrainInfo info; - readonly UpgradeManager manager; - - bool granted; - string previousTerrain; - - public UpgradeOnTerrain(ActorInitializer init, UpgradeOnTerrainInfo info) - { - self = init.Self; - this.info = info; - manager = self.Trait(); - } - - public void Tick(Actor self) - { - var currentTerrain = self.World.Map.GetTerrainInfo(self.Location).Type; - var wantsGranted = info.TerrainTypes.Contains(currentTerrain); - if (currentTerrain != previousTerrain) - { - if (wantsGranted && !granted) - { - foreach (var up in info.Upgrades) - manager.GrantUpgrade(self, up, this); - - granted = true; - } - else if (!wantsGranted && granted) - { - foreach (var up in info.Upgrades) - manager.RevokeUpgrade(self, up, this); - - granted = false; - } - } - - previousTerrain = currentTerrain; - } - } -} diff --git a/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs b/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs index dc006bcb64..d8cc9842cc 100644 --- a/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs +++ b/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs @@ -629,6 +629,14 @@ namespace OpenRA.Mods.Common.UtilityCommands RenameNodeKey(node, "GrantConditionOnMovement"); ConvertUpgradesToCondition(parent, node, "Upgrades", "Condition"); } + + if (node.Key.StartsWith("UpgradeOnTerrain", StringComparison.Ordinal)) + { + RenameNodeKey(node, "GrantConditionOnTerrain"); + ConvertUpgradesToCondition(parent, node, "Upgrades", "Condition"); + if (!node.Value.Nodes.Any(n => n.Key == "Condition")) + node.Value.Nodes.Add(new MiniYamlNode("Condition", "terrain")); + } } UpgradeActorRules(modData, engineVersion, ref node.Value.Nodes, node, depth + 1); diff --git a/mods/ts/rules/defaults.yaml b/mods/ts/rules/defaults.yaml index b041bb5437..bb6595289c 100644 --- a/mods/ts/rules/defaults.yaml +++ b/mods/ts/rules/defaults.yaml @@ -917,9 +917,9 @@ DamageInterval: 16 DamageTypes: BulletDeath Terrain: Veins - UpgradeOnTerrain@VEINS: + GrantConditionOnTerrain@VEINS: TerrainTypes: Veins - Upgrades: veins + Condition: veins WithIdleOverlay@VEINS: Sequence: veins RequiresCondition: veins diff --git a/mods/ts/rules/gdi-vehicles.yaml b/mods/ts/rules/gdi-vehicles.yaml index 4ae451de5e..21312e62a3 100644 --- a/mods/ts/rules/gdi-vehicles.yaml +++ b/mods/ts/rules/gdi-vehicles.yaml @@ -30,8 +30,8 @@ APC: UnloadVoice: Unload LoadingCondition: loading EjectOnDeath: true - UpgradeOnTerrain: - Upgrades: inwater + GrantConditionOnTerrain: + Condition: inwater TerrainTypes: Water WithVoxelBody: RequiresCondition: !inwater @@ -95,7 +95,7 @@ HVR: StationaryInterval: 18 MovingInterval: 6 -DamagedByTerrain@VEINS: - -UpgradeOnTerrain@VEINS: + -GrantConditionOnTerrain@VEINS: -WithIdleOverlay@VEINS: SMECH: @@ -137,7 +137,7 @@ SMECH: Selectable: Bounds: 20, 32, 0, -8 -DamagedByTerrain@VEINS: - -UpgradeOnTerrain@VEINS: + -GrantConditionOnTerrain@VEINS: -WithIdleOverlay@VEINS: MMCH: diff --git a/mods/ts/rules/nod-vehicles.yaml b/mods/ts/rules/nod-vehicles.yaml index 550b8554ae..091508cc0a 100644 --- a/mods/ts/rules/nod-vehicles.yaml +++ b/mods/ts/rules/nod-vehicles.yaml @@ -29,7 +29,7 @@ BGGY: AutoTarget: WithMuzzleOverlay: -DamagedByTerrain@VEINS: - -UpgradeOnTerrain@VEINS: + -GrantConditionOnTerrain@VEINS: -WithIdleOverlay@VEINS: BIKE: @@ -256,7 +256,7 @@ WEED: WithVoxelUnloadBody: -GainsExperience: -DamagedByTerrain@VEINS: - -UpgradeOnTerrain@VEINS: + -GrantConditionOnTerrain@VEINS: -WithIdleOverlay@VEINS: SAPC: diff --git a/mods/ts/rules/shared-vehicles.yaml b/mods/ts/rules/shared-vehicles.yaml index d66be951c3..739dce9f9c 100644 --- a/mods/ts/rules/shared-vehicles.yaml +++ b/mods/ts/rules/shared-vehicles.yaml @@ -100,7 +100,7 @@ HARV: gdi: harv.gdi nod: harv.nod -DamagedByTerrain@VEINS: - -UpgradeOnTerrain@VEINS: + -GrantConditionOnTerrain@VEINS: -WithIdleOverlay@VEINS: LPST: