diff --git a/OpenRA.Game/Traits/Health.cs b/OpenRA.Game/Traits/Health.cs index 8a081c79ee..d017e08f67 100755 --- a/OpenRA.Game/Traits/Health.cs +++ b/OpenRA.Game/Traits/Health.cs @@ -90,7 +90,6 @@ namespace OpenRA.Traits Damage = damage, DamageState = this.DamageState, PreviousDamageState = oldState, - DamageStateChanged = this.DamageState != oldState, Warhead = warhead, }; @@ -98,6 +97,11 @@ namespace OpenRA.Traits .Concat(self.Owner.PlayerActor.TraitsImplementing())) nd.Damaged(self, ai); + + if (DamageState != oldState) + foreach (var nd in self.TraitsImplementing()) + nd.DamageStateChanged(self, ai); + if (attacker != null && attacker.IsInWorld && !attacker.IsDead()) foreach (var nd in attacker.TraitsImplementing() .Concat(attacker.Owner.PlayerActor.TraitsImplementing())) diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index f58595045e..defaaa2043 100755 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -30,7 +30,6 @@ namespace OpenRA.Traits public int Damage; public DamageState DamageState; public DamageState PreviousDamageState; - public bool DamageStateChanged; } public interface ITick { void Tick(Actor self); } @@ -57,6 +56,7 @@ namespace OpenRA.Traits public interface IOrderVoice { string VoicePhraseForOrder(Actor self, Order order); } public interface INotifySold { void Selling(Actor self); void Sold(Actor self); } public interface INotifyDamage { void Damaged(Actor self, AttackInfo e); } + public interface INotifyDamageStateChanged { void DamageStateChanged(Actor self, AttackInfo e); } public interface INotifyKilled { void Killed(Actor self, AttackInfo e); } public interface INotifyAppliedDamage { void AppliedDamage(Actor self, Actor damaged, AttackInfo e); } public interface INotifyBuildComplete { void BuildingComplete(Actor self); } diff --git a/OpenRA.Mods.Cnc/RenderGunboat.cs b/OpenRA.Mods.Cnc/RenderGunboat.cs index 314166370e..9bc8a899ca 100644 --- a/OpenRA.Mods.Cnc/RenderGunboat.cs +++ b/OpenRA.Mods.Cnc/RenderGunboat.cs @@ -19,9 +19,11 @@ namespace OpenRA.Mods.RA.Render public override object Create(ActorInitializer init) { return new RenderGunboat(init.self); } } - class RenderGunboat : RenderSimple, INotifyDamage + class RenderGunboat : RenderSimple, INotifyDamage, INotifyDamageStateChanged { IFacing facing; + bool isSmoking = false; + public RenderGunboat(Actor self) : base(self, () => self.HasTrait() ? self.Trait().turretFacing : 0) { @@ -49,21 +51,19 @@ namespace OpenRA.Mods.RA.Render base.Tick(self); } - bool isSmoking; + public void DamageStateChanged(Actor self, AttackInfo e) + { + if (e.DamageState >= DamageState.Critical) + lastDamage = "-critical"; + else if (e.DamageState >= DamageState.Heavy) + lastDamage = "-damaged"; + else if (e.DamageState < DamageState.Heavy) + lastDamage = ""; + anim.ReplaceAnim(lastDir+lastDamage); + } + public void Damaged(Actor self, AttackInfo e) { - // Damagestate - if (e.DamageStateChanged) - { - if (e.DamageState >= DamageState.Critical) - lastDamage = "-critical"; - else if (e.DamageState >= DamageState.Heavy) - lastDamage = "-damaged"; - else if (e.DamageState < DamageState.Heavy) - lastDamage = ""; - anim.ReplaceAnim(lastDir+lastDamage); - } - // Smoking if (e.DamageState < DamageState.Heavy) return; if (isSmoking) return; diff --git a/OpenRA.Mods.RA/Bridge.cs b/OpenRA.Mods.RA/Bridge.cs index 0bf67b3c92..f5a06f23cc 100644 --- a/OpenRA.Mods.RA/Bridge.cs +++ b/OpenRA.Mods.RA/Bridge.cs @@ -62,7 +62,7 @@ namespace OpenRA.Mods.RA } } - class Bridge: IRenderAsTerrain, INotifyDamage + class Bridge: IRenderAsTerrain, INotifyDamageStateChanged { static string cachedTileset; static Cache, Sprite> sprites; @@ -192,14 +192,11 @@ namespace OpenRA.Mods.RA self.World.Map.CustomTerrain[c.X, c.Y] = GetTerrainType(c); } - public void Damaged(Actor self, AttackInfo e) + public void DamageStateChanged(Actor self, AttackInfo e) { - if (e.DamageStateChanged) - { - UpdateState(); - if (northNeighbour != null) northNeighbour.UpdateState(); - if (southNeighbour != null) southNeighbour.UpdateState(); - } + UpdateState(); + if (northNeighbour != null) northNeighbour.UpdateState(); + if (southNeighbour != null) southNeighbour.UpdateState(); } } } diff --git a/OpenRA.Mods.RA/Buildings/SoundOnDamageTransition.cs b/OpenRA.Mods.RA/Buildings/SoundOnDamageTransition.cs index 3634887c6f..f32b2233fc 100644 --- a/OpenRA.Mods.RA/Buildings/SoundOnDamageTransition.cs +++ b/OpenRA.Mods.RA/Buildings/SoundOnDamageTransition.cs @@ -26,7 +26,7 @@ namespace OpenRA.Mods.RA.Render public object Create(ActorInitializer init) { return new SoundOnDamageTransition(this);} } - public class SoundOnDamageTransition : INotifyDamage + public class SoundOnDamageTransition : INotifyDamageStateChanged { readonly SoundOnDamageTransitionInfo Info; public SoundOnDamageTransition( SoundOnDamageTransitionInfo info ) @@ -34,11 +34,8 @@ namespace OpenRA.Mods.RA.Render Info = info; } - public virtual void Damaged(Actor self, AttackInfo e) + public void DamageStateChanged(Actor self, AttackInfo e) { - if (!e.DamageStateChanged) - return; - if (e.DamageState == DamageState.Dead) Sound.Play(Info.DestroyedSound, self.CenterLocation); else if (e.DamageState >= DamageState.Heavy && e.PreviousDamageState < DamageState.Heavy) diff --git a/OpenRA.Mods.RA/Cloak.cs b/OpenRA.Mods.RA/Cloak.cs index 57db9f09fa..55bda677dc 100644 --- a/OpenRA.Mods.RA/Cloak.cs +++ b/OpenRA.Mods.RA/Cloak.cs @@ -37,7 +37,7 @@ namespace OpenRA.Mods.RA public object Create(ActorInitializer init) { return new Cloak(init.self, this); } } - public class Cloak : IRenderModifier, INotifyDamage, INotifyAttack, ITick, IVisibilityModifier, IRadarColorModifier, ISync + public class Cloak : IRenderModifier, INotifyDamageStateChanged, INotifyAttack, ITick, IVisibilityModifier, IRadarColorModifier, ISync { [Sync] int remainingTime; @@ -63,7 +63,7 @@ namespace OpenRA.Mods.RA } public void Attacking(Actor self, Target target) { DoUncloak(); } - public void Damaged(Actor self, AttackInfo e) + public void DamageStateChanged(Actor self, AttackInfo e) { canCloak = (e.DamageState < DamageState.Critical); if (Cloaked && !canCloak) diff --git a/OpenRA.Mods.RA/Render/RenderBuilding.cs b/OpenRA.Mods.RA/Render/RenderBuilding.cs index cacd7d8099..1490d92b83 100755 --- a/OpenRA.Mods.RA/Render/RenderBuilding.cs +++ b/OpenRA.Mods.RA/Render/RenderBuilding.cs @@ -32,7 +32,7 @@ namespace OpenRA.Mods.RA.Render } } - public class RenderBuilding : RenderSimple, INotifyDamage, IRenderModifier + public class RenderBuilding : RenderSimple, INotifyDamageStateChanged, IRenderModifier { readonly RenderBuildingInfo Info; @@ -96,11 +96,8 @@ namespace OpenRA.Mods.RA.Render anim.PlayRepeating( NormalizeSequence(self, "idle") ); } - public virtual void Damaged(Actor self, AttackInfo e) + public virtual void DamageStateChanged(Actor self, AttackInfo e) { - if (!e.DamageStateChanged) - return; - if (e.DamageState == DamageState.Dead) foreach (var t in FootprintUtils.UnpathableTiles( self.Info.Name, self.Info.Traits.Get(), self.Location )) { diff --git a/OpenRA.Mods.RA/Render/RenderBuildingTurreted.cs b/OpenRA.Mods.RA/Render/RenderBuildingTurreted.cs index e64a1d3750..3b371ae190 100644 --- a/OpenRA.Mods.RA/Render/RenderBuildingTurreted.cs +++ b/OpenRA.Mods.RA/Render/RenderBuildingTurreted.cs @@ -28,10 +28,8 @@ namespace OpenRA.Mods.RA.Render anim.Play( "idle" ); } - public override void Damaged(Actor self, AttackInfo e) + public override void DamageStateChanged(Actor self, AttackInfo e) { - if (!e.DamageStateChanged) return; - if (e.DamageState >= DamageState.Heavy && e.PreviousDamageState < DamageState.Heavy) anim.ReplaceAnim("damaged-idle"); else if (e.DamageState < DamageState.Heavy) diff --git a/OpenRA.Mods.RA/Render/RenderBuildingWall.cs b/OpenRA.Mods.RA/Render/RenderBuildingWall.cs index 7ecdc1939c..125ad38201 100644 --- a/OpenRA.Mods.RA/Render/RenderBuildingWall.cs +++ b/OpenRA.Mods.RA/Render/RenderBuildingWall.cs @@ -35,10 +35,8 @@ namespace OpenRA.Mods.RA.Render anim.PlayFetchIndex(seqName, () => adjacentWalls); } - public override void Damaged(Actor self, AttackInfo e) + public override void DamageStateChanged(Actor self, AttackInfo e) { - if (!e.DamageStateChanged) return; - if (e.DamageState == DamageState.Medium && anim.HasSequence("scratched-idle")) seqName = "scratched-idle"; else if (e.DamageState <= DamageState.Medium) diff --git a/OpenRA.Mods.RA/Render/RenderBuildingWarFactory.cs b/OpenRA.Mods.RA/Render/RenderBuildingWarFactory.cs index 37b4c1f062..4a11973dee 100755 --- a/OpenRA.Mods.RA/Render/RenderBuildingWarFactory.cs +++ b/OpenRA.Mods.RA/Render/RenderBuildingWarFactory.cs @@ -37,7 +37,7 @@ namespace OpenRA.Mods.RA.Render } } - class RenderWarFactory : RenderBuilding, INotifyBuildComplete, INotifyDamage, ITick, INotifyProduction, INotifySold, ISync + class RenderWarFactory : RenderBuilding, INotifyBuildComplete, ITick, INotifyProduction, INotifySold, ISync { public Animation roof; [Sync] @@ -69,10 +69,8 @@ namespace OpenRA.Mods.RA.Render } } - public override void Damaged(Actor self, AttackInfo e) + public override void DamageStateChanged(Actor self, AttackInfo e) { - if (!e.DamageStateChanged) return; - if (roof.CurrentSequence != null) { if (e.DamageState >= DamageState.Heavy)