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.
This commit is contained in:
@@ -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<float> clockFraction)
|
||||
: this(owner, position, -1, palette, isPlayerPalette, posterCollection, arrowSequence, circleSequence)
|
||||
string arrowSequence, string circleSequence, string clockSequence, Func<float> 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<IRenderable> IEffectAboveShroud.RenderAboveShroud(WorldRenderer r)
|
||||
{
|
||||
if (delay > 0)
|
||||
yield break;
|
||||
|
||||
if (!owner.IsAlliedWith(owner.World.RenderPlayer))
|
||||
yield break;
|
||||
|
||||
|
||||
@@ -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<IRenderable> IEffectAboveShroud.RenderAboveShroud(WorldRenderer r)
|
||||
{
|
||||
if (delay > 0)
|
||||
return SpriteRenderable.None;
|
||||
|
||||
if (beacon == null)
|
||||
return SpriteRenderable.None;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user