From adeb2a19cac59e647cb63ee0ef3390ae03dbf217 Mon Sep 17 00:00:00 2001 From: reaperrr Date: Sat, 13 Aug 2016 00:00:28 +0200 Subject: [PATCH 1/4] Remove bogus 'OrDefault' from UpgradeOnDamage UpgradeManager is required anyway, so this was redundant. --- OpenRA.Mods.Common/Traits/Upgrades/UpgradeOnDamage.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/OpenRA.Mods.Common/Traits/Upgrades/UpgradeOnDamage.cs b/OpenRA.Mods.Common/Traits/Upgrades/UpgradeOnDamage.cs index c171a49af8..a66f9fd180 100644 --- a/OpenRA.Mods.Common/Traits/Upgrades/UpgradeOnDamage.cs +++ b/OpenRA.Mods.Common/Traits/Upgrades/UpgradeOnDamage.cs @@ -44,14 +44,11 @@ namespace OpenRA.Mods.Common.Traits public UpgradeOnDamage(Actor self, UpgradeOnDamageInfo info) { this.info = info; - um = self.TraitOrDefault(); + um = self.Trait(); } void INotifyDamageStateChanged.DamageStateChanged(Actor self, AttackInfo e) { - if (um == null) - return; - if (granted && info.GrantPermanently) return; From 7f8607e85b99c0520c21e554990908d575d126ef Mon Sep 17 00:00:00 2001 From: reaperrr Date: Fri, 12 Aug 2016 23:44:34 +0200 Subject: [PATCH 2/4] Fix granting upgrades on initial damage state Previously the upgrade(s) would only be granted when the damage state changed, regardless of whether the initial DamageState was already valid. This prevented the trait from working on Undamaged actors that had just been created, for example. --- .../Traits/Upgrades/UpgradeOnDamage.cs | 36 +++++++++++++------ 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/OpenRA.Mods.Common/Traits/Upgrades/UpgradeOnDamage.cs b/OpenRA.Mods.Common/Traits/Upgrades/UpgradeOnDamage.cs index a66f9fd180..6d3bdda602 100644 --- a/OpenRA.Mods.Common/Traits/Upgrades/UpgradeOnDamage.cs +++ b/OpenRA.Mods.Common/Traits/Upgrades/UpgradeOnDamage.cs @@ -14,7 +14,7 @@ using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits { [Desc("Applies an upgrade to the actor at specified damage states.")] - public class UpgradeOnDamageInfo : ITraitInfo, Requires + public class UpgradeOnDamageInfo : ITraitInfo, Requires, Requires { [UpgradeGrantedReference, FieldLoader.Require] [Desc("The upgrades to grant.")] @@ -35,16 +35,36 @@ namespace OpenRA.Mods.Common.Traits public object Create(ActorInitializer init) { return new UpgradeOnDamage(init.Self, this); } } - public class UpgradeOnDamage : INotifyDamageStateChanged + public class UpgradeOnDamage : INotifyDamageStateChanged, INotifyCreated { readonly UpgradeOnDamageInfo info; readonly UpgradeManager um; + readonly Health health; bool granted; public UpgradeOnDamage(Actor self, UpgradeOnDamageInfo info) { this.info = info; um = self.Trait(); + health = self.Trait(); + } + + void INotifyCreated.Created(Actor self) + { + GrantUpgradeOnValidDamageState(self, health.DamageState); + } + + void GrantUpgradeOnValidDamageState(Actor self, DamageState state) + { + if (!info.ValidDamageStates.HasFlag(state)) + return; + + granted = true; + var rand = Game.CosmeticRandom; + var sound = info.EnabledSounds.RandomOrDefault(rand); + Game.Sound.Play(sound, self.CenterPosition); + foreach (var u in info.Upgrades) + um.GrantUpgrade(self, u, this); } void INotifyDamageStateChanged.DamageStateChanged(Actor self, AttackInfo e) @@ -52,18 +72,12 @@ namespace OpenRA.Mods.Common.Traits if (granted && info.GrantPermanently) return; - var rand = Game.CosmeticRandom; - if (!granted && info.ValidDamageStates.HasFlag(e.DamageState) && !info.ValidDamageStates.HasFlag(e.PreviousDamageState)) - { - granted = true; - var sound = info.EnabledSounds.RandomOrDefault(rand); - Game.Sound.Play(sound, self.CenterPosition); - foreach (var u in info.Upgrades) - um.GrantUpgrade(self, u, this); - } + if (!granted && !info.ValidDamageStates.HasFlag(e.PreviousDamageState)) + GrantUpgradeOnValidDamageState(self, health.DamageState); else if (granted && !info.ValidDamageStates.HasFlag(e.DamageState) && info.ValidDamageStates.HasFlag(e.PreviousDamageState)) { granted = false; + var rand = Game.CosmeticRandom; var sound = info.DisabledSounds.RandomOrDefault(rand); Game.Sound.Play(sound, self.CenterPosition); foreach (var u in info.Upgrades) From b174d00be9aa55f9c69549b912fbe1458e37f3cd Mon Sep 17 00:00:00 2001 From: reaperrr Date: Sun, 14 Aug 2016 20:52:10 +0200 Subject: [PATCH 3/4] Rename UpgradeOnDamage to UpgradeOnDamageState The trait works for 'Undamaged' as well and no longer requires a damage state change to trigger either, so this trait name is more accurate. --- OpenRA.Mods.Common/OpenRA.Mods.Common.csproj | 2 +- .../{UpgradeOnDamage.cs => UpgradeOnDamageState.cs} | 10 +++++----- mods/ts/rules/defaults.yaml | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) rename OpenRA.Mods.Common/Traits/Upgrades/{UpgradeOnDamage.cs => UpgradeOnDamageState.cs} (88%) diff --git a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj index 242b6af3e0..c1d5b9637b 100644 --- a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj +++ b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj @@ -507,7 +507,7 @@ - + diff --git a/OpenRA.Mods.Common/Traits/Upgrades/UpgradeOnDamage.cs b/OpenRA.Mods.Common/Traits/Upgrades/UpgradeOnDamageState.cs similarity index 88% rename from OpenRA.Mods.Common/Traits/Upgrades/UpgradeOnDamage.cs rename to OpenRA.Mods.Common/Traits/Upgrades/UpgradeOnDamageState.cs index 6d3bdda602..0fd2711631 100644 --- a/OpenRA.Mods.Common/Traits/Upgrades/UpgradeOnDamage.cs +++ b/OpenRA.Mods.Common/Traits/Upgrades/UpgradeOnDamageState.cs @@ -14,7 +14,7 @@ using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits { [Desc("Applies an upgrade to the actor at specified damage states.")] - public class UpgradeOnDamageInfo : ITraitInfo, Requires, Requires + public class UpgradeOnDamageStateInfo : ITraitInfo, Requires, Requires { [UpgradeGrantedReference, FieldLoader.Require] [Desc("The upgrades to grant.")] @@ -32,17 +32,17 @@ namespace OpenRA.Mods.Common.Traits [Desc("Are upgrades irrevocable once the conditions have been met?")] public readonly bool GrantPermanently = false; - public object Create(ActorInitializer init) { return new UpgradeOnDamage(init.Self, this); } + public object Create(ActorInitializer init) { return new UpgradeOnDamageState(init.Self, this); } } - public class UpgradeOnDamage : INotifyDamageStateChanged, INotifyCreated + public class UpgradeOnDamageState : INotifyDamageStateChanged, INotifyCreated { - readonly UpgradeOnDamageInfo info; + readonly UpgradeOnDamageStateInfo info; readonly UpgradeManager um; readonly Health health; bool granted; - public UpgradeOnDamage(Actor self, UpgradeOnDamageInfo info) + public UpgradeOnDamageState(Actor self, UpgradeOnDamageStateInfo info) { this.info = info; um = self.Trait(); diff --git a/mods/ts/rules/defaults.yaml b/mods/ts/rules/defaults.yaml index 7cb6c4bc73..eaceb33810 100644 --- a/mods/ts/rules/defaults.yaml +++ b/mods/ts/rules/defaults.yaml @@ -397,7 +397,7 @@ WithInfantryBody: AttackSequence: attack IdleSequences: idle1,idle2 - UpgradeOnDamage@CRITICAL: + UpgradeOnDamageState@CRITICAL: Upgrades: criticalspeed ValidDamageStates: Critical GrantPermanently: true @@ -476,10 +476,10 @@ Weapons: SmallDebris Pieces: 3, 7 Range: 2c0, 5c0 - UpgradeOnDamage@DAMAGED: + UpgradeOnDamageState@DAMAGED: Upgrades: damagedspeed ValidDamageStates: Heavy - UpgradeOnDamage@CRITICAL: + UpgradeOnDamageState@CRITICAL: Upgrades: criticalspeed ValidDamageStates: Critical SpeedMultiplier@DAMAGED: From cd03bc688342296a7e17ed204628b675c2c41d92 Mon Sep 17 00:00:00 2001 From: reaperrr Date: Thu, 18 Aug 2016 22:08:00 +0200 Subject: [PATCH 4/4] Upgrade rule for UpgradeOnDamage to UpgradeOnDamageState --- OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs b/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs index ecc4c7973f..7a1c039647 100644 --- a/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs +++ b/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs @@ -280,6 +280,17 @@ namespace OpenRA.Mods.Common.UtilityCommands } } + if (engineVersion < 20160818) + { + if (depth == 1 && node.Key.StartsWith("UpgradeOnDamage")) + { + var parts = node.Key.Split('@'); + node.Key = "UpgradeOnDamageState"; + if (parts.Length > 1) + node.Key += "@" + parts[1]; + } + } + UpgradeActorRules(modData, engineVersion, ref node.Value.Nodes, node, depth + 1); }