diff --git a/OpenRA.Mods.RA/Cloak.cs b/OpenRA.Mods.RA/Cloak.cs index b8ccb4d671..aabb804941 100644 --- a/OpenRA.Mods.RA/Cloak.cs +++ b/OpenRA.Mods.RA/Cloak.cs @@ -29,7 +29,9 @@ namespace OpenRA.Mods.RA public readonly bool UncloakOnAttack = true; public readonly bool UncloakOnMove = false; public readonly bool UncloakOnUnload = false; - public readonly bool RequiresCrate = false; + + [Desc("Enable only if this upgrade is enabled.")] + public readonly string RequiresUpgrade = null; public readonly string CloakSound = null; public readonly string UncloakSound = null; @@ -40,11 +42,11 @@ namespace OpenRA.Mods.RA public object Create(ActorInitializer init) { return new Cloak(init.self, this); } } - public class Cloak : IRenderModifier, INotifyDamageStateChanged, INotifyAttack, ITick, IVisibilityModifier, IRadarColorModifier, ISync + public class Cloak : IUpgradable, IRenderModifier, INotifyDamageStateChanged, INotifyAttack, ITick, IVisibilityModifier, IRadarColorModifier, ISync { [Sync] int remainingTime; [Sync] bool damageDisabled; - [Sync] bool crateDisabled; + [Sync] bool disabled; Actor self; public readonly CloakInfo Info; @@ -56,7 +58,20 @@ namespace OpenRA.Mods.RA Info = info; remainingTime = info.InitialDelay; - crateDisabled = info.RequiresCrate; + + // Disable if an upgrade is required + disabled = info.RequiresUpgrade != null; + } + + public bool AcceptsUpgrade(string type) + { + return type == Info.RequiresUpgrade; + } + + public void UpgradeAvailable(Actor self, string type, bool available) + { + if (type == Info.RequiresUpgrade) + disabled = !available; } public void Uncloak() { Uncloak(Info.CloakDelay); } @@ -96,7 +111,7 @@ namespace OpenRA.Mods.RA public void Tick(Actor self) { - if (remainingTime > 0 && !crateDisabled && !damageDisabled && --remainingTime <= 0) + if (remainingTime > 0 && !disabled && !damageDisabled && --remainingTime <= 0) Sound.Play(Info.CloakSound, self.CenterPosition); if (self.IsDisabled()) @@ -131,12 +146,5 @@ namespace OpenRA.Mods.RA c = Color.FromArgb(128, c); return c; } - - public bool AcceptsCloakCrate { get { return Info.RequiresCrate && crateDisabled; } } - - public void ReceivedCloakCrate(Actor self) - { - crateDisabled = false; - } } } diff --git a/OpenRA.Mods.RA/Crates/CloakCrateAction.cs b/OpenRA.Mods.RA/Crates/CloakCrateAction.cs deleted file mode 100644 index 160a4b9c32..0000000000 --- a/OpenRA.Mods.RA/Crates/CloakCrateAction.cs +++ /dev/null @@ -1,71 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2007-2011 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. For more information, - * see COPYING. - */ -#endregion - -using System.Linq; - -namespace OpenRA.Mods.RA.Crates -{ - [Desc("Grants the collector the ability to cloak.")] - public class CloakCrateActionInfo : CrateActionInfo - { - [Desc("The range to search for extra collectors in.", "Extra collectors will also be granted the crate action.")] - public readonly WRange Range = new WRange(3); - - [Desc("The maximum number of extra collectors to grant the crate action to.")] - public readonly int MaxExtraCollectors = 4; - - public override object Create(ActorInitializer init) { return new CloakCrateAction(init.self, this); } - } - - public class CloakCrateAction : CrateAction - { - CloakCrateActionInfo Info; - - public CloakCrateAction(Actor self, CloakCrateActionInfo info) - : base(self, info) - { - Info = info; - } - - public override int GetSelectionShares(Actor collector) - { - var cloak = collector.TraitOrDefault(); - if (cloak == null || !cloak.AcceptsCloakCrate) - return 0; - - return base.GetSelectionShares(collector); - } - - public override void Activate(Actor collector) - { - collector.Trait().ReceivedCloakCrate(collector); - - var inRange = self.World.FindActorsInCircle(self.CenterPosition, Info.Range); - inRange = inRange.Where(a => - (a.Owner == collector.Owner) && - (a != collector) && - (a.TraitOrDefault() != null) && - (a.TraitOrDefault().AcceptsCloakCrate)); - if (inRange.Any()) - { - if (Info.MaxExtraCollectors > -1) - inRange = inRange.Take(Info.MaxExtraCollectors); - - if (inRange.Any()) - foreach (Actor actor in inRange) - { - actor.Trait().ReceivedCloakCrate(actor); - } - } - - base.Activate(collector); - } - } -} diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj index 5c8e85bb74..6c4548cde7 100644 --- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj +++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj @@ -193,7 +193,6 @@ - diff --git a/OpenRA.Utility/UpgradeRules.cs b/OpenRA.Utility/UpgradeRules.cs index c2c7276b13..12d943e97b 100644 --- a/OpenRA.Utility/UpgradeRules.cs +++ b/OpenRA.Utility/UpgradeRules.cs @@ -369,6 +369,21 @@ namespace OpenRA.Utility { if (depth == 0 && node.Value.Nodes.Any(n => n.Key.StartsWith("GainsExperience"))) node.Value.Nodes.Add(new MiniYamlNode("GainsStatUpgrades", new MiniYaml(""))); + + if (depth == 1 && node.Key == "-CloakCrateAction") + node.Key = "-UnitUpgradeCrateAction@cloak"; + + if (depth == 1 && node.Key == "CloakCrateAction") + { + node.Key = "UnitUpgradeCrateAction@cloak"; + node.Value.Nodes.Add(new MiniYamlNode("Upgrades", new MiniYaml("cloak"))); + } + + if (depth == 2 && node.Key == "RequiresCrate" && parentKey == "Cloak") + { + node.Key = "RequiresUpgrade"; + node.Value.Value = "cloak"; + } } UpgradeActorRules(engineVersion, ref node.Value.Nodes, node, depth + 1); diff --git a/mods/cnc/maps/gdi04a/map.yaml b/mods/cnc/maps/gdi04a/map.yaml index 95782d2f10..c0f56925fb 100644 --- a/mods/cnc/maps/gdi04a/map.yaml +++ b/mods/cnc/maps/gdi04a/map.yaml @@ -563,7 +563,7 @@ Rules: -GiveMcvCrateAction: -GiveCashCrateAction: -ExplodeCrateAction@fire: - -CloakCrateAction: + -UnitUpgradeCrateAction@cloak: ScriptTriggers: Sequences: diff --git a/mods/cnc/maps/gdi04b/map.yaml b/mods/cnc/maps/gdi04b/map.yaml index 6b5a8782cf..98e836adc3 100644 --- a/mods/cnc/maps/gdi04b/map.yaml +++ b/mods/cnc/maps/gdi04b/map.yaml @@ -645,7 +645,7 @@ Rules: -GiveMcvCrateAction: -GiveCashCrateAction: -ExplodeCrateAction@fire: - -CloakCrateAction: + -UnitUpgradeCrateAction@cloak: Sequences: diff --git a/mods/cnc/maps/the-hot-box/map.yaml b/mods/cnc/maps/the-hot-box/map.yaml index 205273c280..dc896e5f10 100644 --- a/mods/cnc/maps/the-hot-box/map.yaml +++ b/mods/cnc/maps/the-hot-box/map.yaml @@ -211,7 +211,7 @@ Rules: -GiveMcvCrateAction: -RevealMapCrateAction: -HideMapCrateAction: - -CloakCrateAction: + -UnitUpgradeCrateAction@cloak: -ExplodeCrateAction@nuke: -ExplodeCrateAction@boom: -ExplodeCrateAction@fire: diff --git a/mods/cnc/rules/defaults.yaml b/mods/cnc/rules/defaults.yaml index ab2bf64913..036ffe7060 100644 --- a/mods/cnc/rules/defaults.yaml +++ b/mods/cnc/rules/defaults.yaml @@ -33,7 +33,7 @@ BodyOrientation: UpdatesPlayerStatistics: Cloak: - RequiresCrate: true + RequiresUpgrade: cloak InitialDelay: 15 CloakDelay: 90 CloakSound: trans1.aud @@ -81,7 +81,7 @@ BodyOrientation: UpdatesPlayerStatistics: Cloak: - RequiresCrate: true + RequiresUpgrade: cloak InitialDelay: 15 CloakDelay: 90 CloakSound: trans1.aud diff --git a/mods/cnc/rules/misc.yaml b/mods/cnc/rules/misc.yaml index c2cb588de3..040ca5dff0 100644 --- a/mods/cnc/rules/misc.yaml +++ b/mods/cnc/rules/misc.yaml @@ -14,9 +14,10 @@ CRATE: ExplodeCrateAction@fire: Weapon: Napalm.Crate SelectionShares: 5 - CloakCrateAction: + UnitUpgradeCrateAction@cloak: SelectionShares: 5 Effect: cloak + Upgrades: cloak DuplicateUnitCrateAction: SelectionShares: 10 MaxAmount: 5 diff --git a/mods/cnc/rules/vehicles.yaml b/mods/cnc/rules/vehicles.yaml index 413f988eb9..d8d9ed207c 100644 --- a/mods/cnc/rules/vehicles.yaml +++ b/mods/cnc/rules/vehicles.yaml @@ -531,7 +531,7 @@ STNK: RevealsShroud: Range: 7c0 Cloak: - RequiresCrate: false + RequiresUpgrade: cloak InitialDelay: 90 CloakDelay: 90 CloakSound: trans1.aud