diff --git a/OpenRA.Mods.Common/Graphics/ActorPreview.cs b/OpenRA.Mods.Common/Graphics/ActorPreview.cs index 098f336b3a..d5a0f439c1 100644 --- a/OpenRA.Mods.Common/Graphics/ActorPreview.cs +++ b/OpenRA.Mods.Common/Graphics/ActorPreview.cs @@ -12,6 +12,7 @@ using System; using System.Collections.Generic; using OpenRA.Graphics; using OpenRA.Primitives; +using OpenRA.Traits; namespace OpenRA.Mods.Common.Graphics { @@ -41,5 +42,32 @@ namespace OpenRA.Mods.Common.Graphics public T Get() where T : IActorInit { return dict.Get(); } public U Get() where T : IActorInit { return dict.Get().Value(World); } public bool Contains() where T : IActorInit { return dict.Contains(); } + + public DamageState GetDamageState() + { + var health = dict.GetOrDefault(); + + if (health == null) + return DamageState.Undamaged; + + var hf = health.Value(null); + + if (hf <= 0) + return DamageState.Dead; + + if (hf < 0.25f) + return DamageState.Critical; + + if (hf < 0.5f) + return DamageState.Heavy; + + if (hf < 0.75f) + return DamageState.Medium; + + if (hf < 1.0f) + return DamageState.Light; + + return DamageState.Undamaged; + } } } diff --git a/OpenRA.Mods.Common/Traits/Render/RenderBuildingSilo.cs b/OpenRA.Mods.Common/Traits/Render/RenderBuildingSilo.cs index 5f952dc3d6..4016606988 100644 --- a/OpenRA.Mods.Common/Traits/Render/RenderBuildingSilo.cs +++ b/OpenRA.Mods.Common/Traits/Render/RenderBuildingSilo.cs @@ -23,7 +23,7 @@ namespace OpenRA.Mods.Common.Traits { // Show a static frame instead of animating all of the fullness states var anim = new Animation(init.World, image, () => 0); - anim.PlayFetchIndex(Sequence, () => 0); + anim.PlayFetchIndex(RenderSprites.NormalizeSequence(anim, init.GetDamageState(), Sequence), () => 0); yield return new SpriteActorPreview(anim, WVec.Zero, 0, p, rs.Scale); } diff --git a/OpenRA.Mods.Common/Traits/Render/RenderBuildingTurreted.cs b/OpenRA.Mods.Common/Traits/Render/RenderBuildingTurreted.cs index 9916134d61..337847128a 100644 --- a/OpenRA.Mods.Common/Traits/Render/RenderBuildingTurreted.cs +++ b/OpenRA.Mods.Common/Traits/Render/RenderBuildingTurreted.cs @@ -28,7 +28,7 @@ namespace OpenRA.Mods.Common.Traits // Show the correct turret facing var anim = new Animation(init.World, image, () => t.InitialFacing); - anim.PlayRepeating(Sequence); + anim.PlayRepeating(RenderSprites.NormalizeSequence(anim, init.GetDamageState(), Sequence)); yield return new SpriteActorPreview(anim, WVec.Zero, 0, p, rs.Scale); } diff --git a/OpenRA.Mods.Common/Traits/Render/RenderBuildingWall.cs b/OpenRA.Mods.Common/Traits/Render/RenderBuildingWall.cs index 26f5a1c279..b4fdc0ae6d 100644 --- a/OpenRA.Mods.Common/Traits/Render/RenderBuildingWall.cs +++ b/OpenRA.Mods.Common/Traits/Render/RenderBuildingWall.cs @@ -26,7 +26,7 @@ namespace OpenRA.Mods.Common.Traits { // Show a static frame instead of animating all of the wall states var anim = new Animation(init.World, image, () => 0); - anim.PlayFetchIndex(Sequence, () => 0); + anim.PlayFetchIndex(RenderSprites.NormalizeSequence(anim, init.GetDamageState(), Sequence), () => 0); yield return new SpriteActorPreview(anim, WVec.Zero, 0, p, rs.Scale); } diff --git a/OpenRA.Mods.Common/Traits/Render/RenderSimple.cs b/OpenRA.Mods.Common/Traits/Render/RenderSimple.cs index 80fd682124..95a877373a 100644 --- a/OpenRA.Mods.Common/Traits/Render/RenderSimple.cs +++ b/OpenRA.Mods.Common/Traits/Render/RenderSimple.cs @@ -28,7 +28,8 @@ namespace OpenRA.Mods.Common.Traits var facing = ifacing != null ? init.Contains() ? init.Get() : ifacing.GetInitialFacing() : 0; var anim = new Animation(init.World, image, () => facing); - anim.PlayRepeating(Sequence); + anim.PlayRepeating(RenderSprites.NormalizeSequence(anim, init.GetDamageState(), Sequence)); + yield return new SpriteActorPreview(anim, WVec.Zero, 0, p, rs.Scale); } diff --git a/OpenRA.Mods.Common/Traits/Render/WithBarrel.cs b/OpenRA.Mods.Common/Traits/Render/WithBarrel.cs index cd894168b3..666b009f1a 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithBarrel.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithBarrel.cs @@ -42,7 +42,7 @@ namespace OpenRA.Mods.Common.Traits .First(tt => tt.Turret == armament.Turret); var anim = new Animation(init.World, image, () => t.InitialFacing); - anim.Play(Sequence); + anim.Play(RenderSprites.NormalizeSequence(anim, init.GetDamageState(), Sequence)); var turretOrientation = body.QuantizeOrientation(new WRot(WAngle.Zero, WAngle.Zero, WAngle.FromFacing(t.InitialFacing)), facings); var turretOffset = body.LocalToWorld(t.Offset.Rotate(turretOrientation)); diff --git a/OpenRA.Mods.Common/Traits/Render/WithIdleOverlay.cs b/OpenRA.Mods.Common/Traits/Render/WithIdleOverlay.cs index 41d427f999..a27e908266 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithIdleOverlay.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithIdleOverlay.cs @@ -43,7 +43,7 @@ namespace OpenRA.Mods.Common.Traits var body = init.Actor.Traits.Get(); var facing = init.Contains() ? init.Get() : 0; var anim = new Animation(init.World, image, () => facing); - anim.PlayRepeating(Sequence); + anim.PlayRepeating(RenderSprites.NormalizeSequence(anim, init.GetDamageState(), Sequence)); var orientation = body.QuantizeOrientation(new WRot(WAngle.Zero, WAngle.Zero, WAngle.FromFacing(facing)), facings); var offset = body.LocalToWorld(Offset.Rotate(orientation)); diff --git a/OpenRA.Mods.Common/Traits/Render/WithInfantryBody.cs b/OpenRA.Mods.Common/Traits/Render/WithInfantryBody.cs index 471d042486..7cc8c4713a 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithInfantryBody.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithInfantryBody.cs @@ -35,7 +35,7 @@ namespace OpenRA.Mods.Common.Traits facing = init.Contains() ? init.Get() : ifacing.GetInitialFacing(); var anim = new Animation(init.World, image, () => facing); - anim.PlayRepeating(StandSequences.First()); + anim.PlayRepeating(RenderSprites.NormalizeSequence(anim, init.GetDamageState(), StandSequences.First())); yield return new SpriteActorPreview(anim, WVec.Zero, 0, p, rs.Scale); } diff --git a/OpenRA.Mods.Common/Traits/Render/WithProductionDoorOverlay.cs b/OpenRA.Mods.Common/Traits/Render/WithProductionDoorOverlay.cs index 40c56daba9..c8de8beca9 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithProductionDoorOverlay.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithProductionDoorOverlay.cs @@ -27,7 +27,7 @@ namespace OpenRA.Mods.TS.Traits public IEnumerable RenderPreviewSprites(ActorPreviewInitializer init, RenderSpritesInfo rs, string image, int facings, PaletteReference p) { var anim = new Animation(init.World, image, () => 0); - anim.PlayFetchIndex(Sequence, () => 0); + anim.PlayFetchIndex(RenderSprites.NormalizeSequence(anim, init.GetDamageState(), Sequence), () => 0); var bi = init.Actor.Traits.Get(); var offset = FootprintUtils.CenterOffset(init.World, bi).Y + 512; // Additional 512 units move from center -> top of cell diff --git a/OpenRA.Mods.Common/Traits/Render/WithRotor.cs b/OpenRA.Mods.Common/Traits/Render/WithRotor.cs index 60c73a5659..579607f866 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithRotor.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithRotor.cs @@ -38,7 +38,7 @@ namespace OpenRA.Mods.Common.Traits var body = init.Actor.Traits.Get(); var facing = init.Contains() ? init.Get() : 0; var anim = new Animation(init.World, image, () => facing); - anim.PlayRepeating(Sequence); + anim.PlayRepeating(RenderSprites.NormalizeSequence(anim, init.GetDamageState(), Sequence)); var orientation = body.QuantizeOrientation(new WRot(WAngle.Zero, WAngle.Zero, WAngle.FromFacing(facing)), facings); var offset = body.LocalToWorld(Offset.Rotate(orientation)); diff --git a/OpenRA.Mods.Common/Traits/Render/WithTurret.cs b/OpenRA.Mods.Common/Traits/Render/WithTurret.cs index e13708d5f0..6dbaa56c01 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithTurret.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithTurret.cs @@ -48,7 +48,7 @@ namespace OpenRA.Mods.Common.Traits var turretFacing = init.Contains() ? init.Get() : t.InitialFacing; var anim = new Animation(init.World, image, () => turretFacing); - anim.Play(Sequence); + anim.Play(RenderSprites.NormalizeSequence(anim, init.GetDamageState(), Sequence)); var orientation = body.QuantizeOrientation(new WRot(WAngle.Zero, WAngle.Zero, WAngle.FromFacing(bodyFacing)), facings); var offset = body.LocalToWorld(t.Offset.Rotate(orientation));