diff --git a/OpenRA.Mods.Common/Effects/Beacon.cs b/OpenRA.Mods.Common/Effects/Beacon.cs index 434df3b015..059e7ab9b4 100644 --- a/OpenRA.Mods.Common/Effects/Beacon.cs +++ b/OpenRA.Mods.Common/Effects/Beacon.cs @@ -32,18 +32,21 @@ namespace OpenRA.Mods.Common.Effects readonly Animation clock; readonly int duration; + int delay; int arrowHeight = MaxArrowHeight; int arrowSpeed = 50; int tick; // Player-placed beacons are removed after a delay - public Beacon(Player owner, WPos position, int duration, string beaconPalette, bool isPlayerPalette, string beaconCollection, string arrowSprite, string circleSprite) + public Beacon(Player owner, WPos position, int duration, string beaconPalette, bool isPlayerPalette, + string beaconCollection, string arrowSprite, string circleSprite, int delay = 0) { this.owner = owner; this.position = position; this.beaconPalette = beaconPalette; this.isPlayerPalette = isPlayerPalette; this.duration = duration; + this.delay = delay; if (!string.IsNullOrEmpty(arrowSprite)) { @@ -58,10 +61,10 @@ namespace OpenRA.Mods.Common.Effects } } - // Support power beacons are expected to clean themselves up + // By default, support power beacons are expected to clean themselves up public Beacon(Player owner, WPos position, bool isPlayerPalette, string palette, string posterCollection, string posterType, string posterPalette, - string arrowSequence, string circleSequence, string clockSequence, Func clockFraction) - : this(owner, position, -1, palette, isPlayerPalette, posterCollection, arrowSequence, circleSequence) + string arrowSequence, string circleSequence, string clockSequence, Func clockFraction, int delay = 0, int duration = -1) + : this(owner, position, duration, palette, isPlayerPalette, posterCollection, arrowSequence, circleSequence, delay) { this.posterPalette = posterPalette; @@ -80,6 +83,9 @@ namespace OpenRA.Mods.Common.Effects void IEffect.Tick(World world) { + if (delay-- > 0) + return; + arrowHeight += arrowSpeed; var clamped = arrowHeight.Clamp(0, MaxArrowHeight); if (arrowHeight != clamped) @@ -105,6 +111,9 @@ namespace OpenRA.Mods.Common.Effects IEnumerable IEffectAboveShroud.RenderAboveShroud(WorldRenderer r) { + if (delay > 0) + yield break; + if (!owner.IsAlliedWith(owner.World.RenderPlayer)) yield break; diff --git a/OpenRA.Mods.Common/Traits/SupportPowers/AirstrikePower.cs b/OpenRA.Mods.Common/Traits/SupportPowers/AirstrikePower.cs index 6ae356a9ea..2b5db5d083 100644 --- a/OpenRA.Mods.Common/Traits/SupportPowers/AirstrikePower.cs +++ b/OpenRA.Mods.Common/Traits/SupportPowers/AirstrikePower.cs @@ -176,7 +176,7 @@ namespace OpenRA.Mods.Common.Traits Info.ArrowSequence, Info.CircleSequence, Info.ClockSequence, - () => 1 - ((distanceTestActor.CenterPosition - target).HorizontalLength - info.BeaconDistanceOffset.Length) * 1f / distance); + () => 1 - ((distanceTestActor.CenterPosition - target).HorizontalLength - info.BeaconDistanceOffset.Length) * 1f / distance); w.Add(beacon); } diff --git a/OpenRA.Mods.TS/Effects/AnimatedBeacon.cs b/OpenRA.Mods.TS/Effects/AnimatedBeacon.cs index 317dd2b596..c537af4a9e 100644 --- a/OpenRA.Mods.TS/Effects/AnimatedBeacon.cs +++ b/OpenRA.Mods.TS/Effects/AnimatedBeacon.cs @@ -27,15 +27,17 @@ namespace OpenRA.Mods.TS.Effects readonly Animation beacon; readonly int duration; + int delay; int tick; - public AnimatedBeacon(Player owner, WPos position, int duration, string beaconPalette, bool isPlayerPalette, string beaconImage, string beaconSequence) + public AnimatedBeacon(Player owner, WPos position, int duration, string beaconPalette, bool isPlayerPalette, string beaconImage, string beaconSequence, int delay = 0) { this.owner = owner; this.position = position; this.beaconPalette = beaconPalette; this.isPlayerPalette = isPlayerPalette; this.duration = duration; + this.delay = delay; if (!string.IsNullOrEmpty(beaconSequence)) { @@ -49,6 +51,9 @@ namespace OpenRA.Mods.TS.Effects void IEffect.Tick(World world) { + if (delay-- > 0) + return; + if (beacon != null) beacon.Tick(); @@ -60,6 +65,9 @@ namespace OpenRA.Mods.TS.Effects IEnumerable IEffectAboveShroud.RenderAboveShroud(WorldRenderer r) { + if (delay > 0) + return SpriteRenderable.None; + if (beacon == null) return SpriteRenderable.None;