diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index df81e3eb88..577b1c972c 100755 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -69,6 +69,7 @@ namespace OpenRA.Traits 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 INotifyRepair { void Repairing(Actor self, Actor host); } 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.RA/Activities/Repair.cs b/OpenRA.Mods.RA/Activities/Repair.cs index d1d87caad7..5941b23ab5 100644 --- a/OpenRA.Mods.RA/Activities/Repair.cs +++ b/OpenRA.Mods.RA/Activities/Repair.cs @@ -63,9 +63,8 @@ namespace OpenRA.Mods.RA.Activities self.InflictDamage(self, -hpToRepair, null); - if (host != null) - host.Trait() - .PlayCustomAnim(host, "active"); + foreach (var depot in host.TraitsImplementing()) + depot.Repairing(self, host); remainingTicks = repairsUnits.Interval; } diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj index 61f49fe7cf..ec9d881bfa 100644 --- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj +++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj @@ -526,6 +526,8 @@ + + diff --git a/OpenRA.Mods.RA/Render/WithRepairAnimation.cs b/OpenRA.Mods.RA/Render/WithRepairAnimation.cs new file mode 100644 index 0000000000..b5946f01e9 --- /dev/null +++ b/OpenRA.Mods.RA/Render/WithRepairAnimation.cs @@ -0,0 +1,49 @@ +#region Copyright & License Information +/* + * Copyright 2007-2014 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.Collections.Generic; +using System.Linq; +using OpenRA.FileFormats; +using OpenRA.Graphics; +using OpenRA.Traits; +using OpenRA.Mods.RA.Buildings; +using OpenRA.Effects; + +namespace OpenRA.Mods.RA.Render +{ + public class WithRepairAnimationInfo : ITraitInfo, Requires + { + [Desc("Sequence name to use")] + public readonly string Sequence = "active"; + + public readonly bool PauseOnLowPower = false; + + public object Create(ActorInitializer init) { return new WithRepairAnimation(init.self, this); } + } + + public class WithRepairAnimation : INotifyRepair + { + IEnumerable disabled; + WithRepairAnimationInfo info; + + public WithRepairAnimation(Actor self, WithRepairAnimationInfo info) + { + disabled = self.TraitsImplementing(); + this.info = info; + } + + public void Repairing(Actor self, Actor host) + { + var building = host.TraitOrDefault(); + if (building != null && !(info.PauseOnLowPower && disabled.Any(d => d.Disabled))) + building.PlayCustomAnim(host, info.Sequence); + } + } +} \ No newline at end of file diff --git a/OpenRA.Mods.RA/Render/WithRepairOverlay.cs b/OpenRA.Mods.RA/Render/WithRepairOverlay.cs new file mode 100644 index 0000000000..094c35b7ad --- /dev/null +++ b/OpenRA.Mods.RA/Render/WithRepairOverlay.cs @@ -0,0 +1,77 @@ +#region Copyright & License Information +/* + * Copyright 2007-2014 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; +using OpenRA.FileFormats; +using OpenRA.Graphics; +using OpenRA.Traits; +using OpenRA.Mods.RA.Buildings; +using OpenRA.Effects; + +namespace OpenRA.Mods.RA.Render +{ + public class WithRepairOverlayInfo : ITraitInfo, Requires, Requires + { + [Desc("Sequence name to use")] + public readonly string Sequence = "active"; + + [Desc("Position relative to body")] + public readonly WVec Offset = WVec.Zero; + + public readonly bool PauseOnLowPower = false; + + public object Create(ActorInitializer init) { return new WithRepairOverlay(init.self, this); } + } + + public class WithRepairOverlay : INotifyDamageStateChanged, INotifyBuildComplete, INotifySold, INotifyRepair + { + Animation overlay; + bool buildComplete; + + public WithRepairOverlay(Actor self, WithRepairOverlayInfo info) + { + var rs = self.Trait(); + var body = self.Trait(); + var disabled = self.TraitsImplementing(); + + buildComplete = !self.HasTrait(); // always render instantly for units + overlay = new Animation(self.World, rs.GetImage(self)); + overlay.Play(info.Sequence); + rs.anims.Add("repair_{0}".F(info.Sequence), + new AnimationWithOffset(overlay, + () => body.LocalToWorld(info.Offset.Rotate(body.QuantizeOrientation(self, self.Orientation))), + () => !buildComplete, + () => info.PauseOnLowPower && disabled.Any(d => d.Disabled), + p => WithTurret.ZOffsetFromCenter(self, p, 1))); + } + + public void BuildingComplete(Actor self) + { + self.World.AddFrameEndTask(w => w.Add(new DelayedAction(120, () => + buildComplete = true))); + } + + public void Sold(Actor self) { } + public void Selling(Actor self) + { + buildComplete = false; + } + + public void DamageStateChanged(Actor self, AttackInfo e) + { + overlay.ReplaceAnim(RenderSprites.NormalizeSequence(overlay, e.DamageState, overlay.CurrentSequence.Name)); + } + + public void Repairing(Actor self, Actor host) + { + overlay.Play(overlay.CurrentSequence.Name); + } + } +} \ No newline at end of file diff --git a/mods/cnc/rules/structures.yaml b/mods/cnc/rules/structures.yaml index 5fcf9e9ffe..8e798c145d 100644 --- a/mods/cnc/rules/structures.yaml +++ b/mods/cnc/rules/structures.yaml @@ -340,6 +340,7 @@ HPAD: Produces: Aircraft Reservable: RepairsUnits: + WithRepairAnimation: RallyPoint: ProductionQueue: Type: Aircraft @@ -422,6 +423,7 @@ FIX: Reservable: RepairsUnits: RallyPoint: + WithRepairAnimation: EYE: Inherits: ^BaseBuilding diff --git a/mods/d2k/rules/structures.yaml b/mods/d2k/rules/structures.yaml index 2655ddabdc..da3e69fc6f 100644 --- a/mods/d2k/rules/structures.yaml +++ b/mods/d2k/rules/structures.yaml @@ -577,6 +577,7 @@ WALL: RallyPoint: 1,3 ProvidesCustomPrerequisite: Prerequisite: Repair + WithRepairOverlay: ^HIGHTECH: Inherits: ^Building diff --git a/mods/d2k/sequences/structures.yaml b/mods/d2k/sequences/structures.yaml index 5ee32b28ef..5f54f14f27 100644 --- a/mods/d2k/sequences/structures.yaml +++ b/mods/d2k/sequences/structures.yaml @@ -219,17 +219,17 @@ repaira: Start: 2571 Offset: -48,48 ZOffset: -1c511 -# active: DATA # TODO: overlay -# Start: 4746 -# Length: 14 -# Offset: -48,48 -# ZOffset: -1c511 -# damaged-active: DATA # TODO: overlay -# Start: 4746 -# Length: 14 -# Tick: 60 -# Offset: -48,48 -# ZOffset: -1c511 + active: DATA + Start: 4746 + Length: 14 + Offset: -48,48 + ZOffset: -1c511 + damaged-active: DATA + Start: 4746 + Length: 14 + Tick: 60 + Offset: -48,48 + ZOffset: -1c511 damaged-idle: DATA Start: 2572 Offset: -48,48 @@ -252,17 +252,17 @@ repairh: Start: 2731 Offset: -48,48 ZOffset: -1c511 -# active: DATA # TODO: overlay -# Start: 4746 -# Length: 14 -# Offset: -48,48 -# ZOffset: -1c511 -# damaged-active: DATA # TODO: overlay -# Start: 4746 -# Length: 14 -# Tick: 60 -# Offset: -48,48 -# ZOffset: -1c511 + active: DATA + Start: 4746 + Length: 14 + Offset: -48,48 + ZOffset: -1c511 + damaged-active: DATA + Start: 4746 + Length: 14 + Tick: 60 + Offset: -48,48 + ZOffset: -1c511 damaged-idle: DATA Start: 2732 Offset: -48,48 @@ -285,17 +285,17 @@ repairo: Start: 2891 Offset: -48,48 ZOffset: -1c511 -# active: DATA # TODO: overlay -# Start: 4746 -# Length: 14 -# Offset: -48,48 -# ZOffset: -1c511 -# damaged-active: DATA # TODO: overlay -# Start: 4746 -# Length: 14 -# Tick: 60 -# Offset: -48,48 -# ZOffset: -1c511 + active: DATA + Start: 4746 + Length: 14 + Offset: -48,48 + ZOffset: -1c511 + damaged-active: DATA + Start: 4746 + Length: 14 + Tick: 60 + Offset: -48,48 + ZOffset: -1c511 damaged-idle: DATA Start: 2892 Offset: -48,48 diff --git a/mods/ra/rules/structures.yaml b/mods/ra/rules/structures.yaml index df80c23d6d..16d004a516 100644 --- a/mods/ra/rules/structures.yaml +++ b/mods/ra/rules/structures.yaml @@ -1197,6 +1197,7 @@ FIX: IronCurtainable: RepairsUnits: Interval: 10 + WithRepairAnimation: FACF: Inherits: ^Building