From a846e484c7820793ed47b67f88b6cb83aa025ed6 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sat, 3 Dec 2016 16:23:04 +0000 Subject: [PATCH] Convert Disguise to conditions. --- .../UtilityCommands/UpgradeRules.cs | 7 +++++ OpenRA.Mods.RA/Traits/Disguise.cs | 31 +++++++++---------- mods/ra/rules/infantry.yaml | 1 + mods/ts/rules/civilian-infantry.yaml | 1 + 4 files changed, 24 insertions(+), 16 deletions(-) diff --git a/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs b/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs index 373232e9f1..793bec7ac1 100644 --- a/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs +++ b/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs @@ -596,6 +596,13 @@ namespace OpenRA.Mods.Common.UtilityCommands if (node.Key.StartsWith("Cloak", StringComparison.Ordinal)) ConvertUpgradesToCondition(parent, node, "WhileCloakedUpgrades", "CloakedCondition"); + + if (node.Key == "Disguise") + { + ConvertUpgradesToCondition(parent, node, "Upgrades", "DisguisedCondition"); + if (!node.Value.Nodes.Any(n => n.Key == "DisguisedCondition")) + node.Value.Nodes.Add(new MiniYamlNode("DisguisedCondition", "disguise")); + } } UpgradeActorRules(modData, engineVersion, ref node.Value.Nodes, node, depth + 1); diff --git a/OpenRA.Mods.RA/Traits/Disguise.cs b/OpenRA.Mods.RA/Traits/Disguise.cs index 1a39180949..2416bb55ee 100644 --- a/OpenRA.Mods.RA/Traits/Disguise.cs +++ b/OpenRA.Mods.RA/Traits/Disguise.cs @@ -65,13 +65,13 @@ namespace OpenRA.Mods.RA.Traits [VoiceReference] public readonly string Voice = "Action"; [UpgradeGrantedReference] - [Desc("Upgrades to grant when disguised.")] - public readonly string[] Upgrades = { "disguise" }; + [Desc("The condition to grant to self while disguised.")] + public readonly string DisguisedCondition = null; public object Create(ActorInitializer init) { return new Disguise(init.Self, this); } } - class Disguise : IEffectiveOwner, IIssueOrder, IResolveOrder, IOrderVoice, IRadarColorModifier, INotifyAttack + class Disguise : INotifyCreated, IEffectiveOwner, IIssueOrder, IResolveOrder, IOrderVoice, IRadarColorModifier, INotifyAttack { public Player AsPlayer { get; private set; } public string AsSprite { get; private set; } @@ -82,14 +82,19 @@ namespace OpenRA.Mods.RA.Traits readonly Actor self; readonly DisguiseInfo info; - readonly Lazy um; + + UpgradeManager um; + int disguisedToken = UpgradeManager.InvalidConditionToken; public Disguise(Actor self, DisguiseInfo info) { this.self = self; this.info = info; + } - um = Exts.Lazy(() => self.TraitOrDefault()); + void INotifyCreated.Created(Actor self) + { + um = self.TraitOrDefault(); } public IEnumerable Orders @@ -182,18 +187,12 @@ namespace OpenRA.Mods.RA.Traits foreach (var t in self.TraitsImplementing()) t.OnEffectiveOwnerChanged(self, oldEffectiveOwner, AsPlayer); - if (Disguised != oldDisguiseSetting && um.Value != null) + if (Disguised != oldDisguiseSetting && um != null) { - foreach (var u in info.Upgrades) - { - if (!um.Value.AcknowledgesUpgrade(self, u)) - continue; - - if (Disguised) - um.Value.GrantUpgrade(self, u, this); - else - um.Value.RevokeUpgrade(self, u, this); - } + if (Disguised && disguisedToken == UpgradeManager.InvalidConditionToken && !string.IsNullOrEmpty(info.DisguisedCondition)) + disguisedToken = um.GrantCondition(self, info.DisguisedCondition); + else if (!Disguised && disguisedToken != UpgradeManager.InvalidConditionToken) + disguisedToken = um.RevokeCondition(self, disguisedToken); } } diff --git a/mods/ra/rules/infantry.yaml b/mods/ra/rules/infantry.yaml index dac456257e..577b3a984a 100644 --- a/mods/ra/rules/infantry.yaml +++ b/mods/ra/rules/infantry.yaml @@ -211,6 +211,7 @@ SPY: Voice: Move Disguise: Voice: Move + DisguisedCondition: disguise Infiltrates: Types: SpyInfiltrate PlayerExperience: 50 diff --git a/mods/ts/rules/civilian-infantry.yaml b/mods/ts/rules/civilian-infantry.yaml index b74e1c2654..8b5ce6436e 100644 --- a/mods/ts/rules/civilian-infantry.yaml +++ b/mods/ts/rules/civilian-infantry.yaml @@ -64,6 +64,7 @@ CHAMSPY: Range: 9c0 Passenger: Disguise: + DisguisedCondition: disguise WithDecoration@disguise: Image: pips Sequence: pip-disguise