From 871576b3006e9f91e853f20b4fbbd2a2f3259cdb Mon Sep 17 00:00:00 2001 From: reaperrr Date: Sat, 5 Nov 2016 18:52:37 +0100 Subject: [PATCH] Add delay and full duration support to beacons Previously, support power beacons were hardcoded to unlimited duration and then cleaned up directly by the support power. This is problematic if we want the beacon to remove itself after a certain delay, though. --- OpenRA.Mods.Common/Effects/Beacon.cs | 17 +++++++++++++---- .../Traits/SupportPowers/AirstrikePower.cs | 2 +- OpenRA.Mods.TS/Effects/AnimatedBeacon.cs | 10 +++++++++- 3 files changed, 23 insertions(+), 6 deletions(-) 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;