diff --git a/OpenRA.Mods.Cnc/IonCannonPower.cs b/OpenRA.Mods.Cnc/IonCannonPower.cs index 3a96806c10..78be5acc6a 100644 --- a/OpenRA.Mods.Cnc/IonCannonPower.cs +++ b/OpenRA.Mods.Cnc/IonCannonPower.cs @@ -28,8 +28,10 @@ namespace OpenRA.Mods.Cnc return new SelectGenericPowerTarget(order, manager, "ioncannon", MouseButton.Left); } - public override void Activate(Actor self, Order order) + public override void Activate(Actor self, Order order, SupportPowerManager manager) { + base.Activate(self, order, manager); + self.World.AddFrameEndTask(w => { Sound.Play(Info.LaunchSound, order.TargetLocation.CenterPosition); diff --git a/OpenRA.Mods.RA/SupportPowers/AirstrikePower.cs b/OpenRA.Mods.RA/SupportPowers/AirstrikePower.cs index bb6204144c..2bf7756d76 100755 --- a/OpenRA.Mods.RA/SupportPowers/AirstrikePower.cs +++ b/OpenRA.Mods.RA/SupportPowers/AirstrikePower.cs @@ -50,10 +50,11 @@ namespace OpenRA.Mods.RA public AirstrikePower(Actor self, AirstrikePowerInfo info) : base(self, info) { } - public override void Activate(Actor self, Order order) + public override void Activate(Actor self, Order order, SupportPowerManager manager) { - var info = Info as AirstrikePowerInfo; + base.Activate(self, order, manager); + var info = Info as AirstrikePowerInfo; var attackFacing = Util.QuantizeFacing(self.World.SharedRandom.Next(256), info.QuantizedFacings) * (256 / info.QuantizedFacings); var attackRotation = WRot.FromFacing(attackFacing); var delta = new WVec(0, -1024, 0).Rotate(attackRotation); @@ -69,7 +70,7 @@ namespace OpenRA.Mods.RA Action onEnterRange = a => { - // Spawn a camera when the first plane enters the target area + // Spawn a camera and remove the beacon when the first plane enters the target area if (info.CameraActor != null && !aircraftInRange.Any(kv => kv.Value)) { self.World.AddFrameEndTask(w => @@ -82,6 +83,15 @@ namespace OpenRA.Mods.RA }); } + if (beacon != null) + { + self.World.AddFrameEndTask(w => + { + w.Remove(beacon); + beacon = null; + }); + } + aircraftInRange[a] = true; }; @@ -89,7 +99,7 @@ namespace OpenRA.Mods.RA { aircraftInRange[a] = false; - // Remove the camera when the final plane leaves the target area + // Remove the camera and flare when the final plane leaves the target area if (!aircraftInRange.Any(kv => kv.Value)) { if (camera != null) diff --git a/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs b/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs index 23f3195317..58daddbfc1 100644 --- a/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs +++ b/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs @@ -34,8 +34,10 @@ namespace OpenRA.Mods.RA return new SelectTarget(order, manager, this); } - public override void Activate(Actor self, Order order) + public override void Activate(Actor self, Order order, SupportPowerManager manager) { + base.Activate(self, order, manager); + foreach (var target in UnitsInRange(order.ExtraLocation)) { var cs = target.Trait(); diff --git a/OpenRA.Mods.RA/SupportPowers/GpsPower.cs b/OpenRA.Mods.RA/SupportPowers/GpsPower.cs index 6f03183fdd..7eef20f56d 100755 --- a/OpenRA.Mods.RA/SupportPowers/GpsPower.cs +++ b/OpenRA.Mods.RA/SupportPowers/GpsPower.cs @@ -97,8 +97,10 @@ namespace OpenRA.Mods.RA self.Owner.PlayerActor.Trait().Powers[key].Activate(new Order()); } - public override void Activate(Actor self, Order order) + public override void Activate(Actor self, Order order, SupportPowerManager manager) { + base.Activate(self, order, manager); + self.World.AddFrameEndTask(w => { Sound.PlayToPlayer(self.Owner, Info.LaunchSound); diff --git a/OpenRA.Mods.RA/SupportPowers/IronCurtainPower.cs b/OpenRA.Mods.RA/SupportPowers/IronCurtainPower.cs index 31cdf45257..1d78b2eafc 100644 --- a/OpenRA.Mods.RA/SupportPowers/IronCurtainPower.cs +++ b/OpenRA.Mods.RA/SupportPowers/IronCurtainPower.cs @@ -34,8 +34,10 @@ namespace OpenRA.Mods.RA return new SelectTarget(order, manager, this); } - public override void Activate(Actor self, Order order) + public override void Activate(Actor self, Order order, SupportPowerManager manager) { + base.Activate(self, order, manager); + self.Trait().PlayCustomAnim(self, "active"); Sound.Play("ironcur9.aud", order.TargetLocation.CenterPosition); diff --git a/OpenRA.Mods.RA/SupportPowers/NukePower.cs b/OpenRA.Mods.RA/SupportPowers/NukePower.cs index 715e0d0835..d62da05d6d 100755 --- a/OpenRA.Mods.RA/SupportPowers/NukePower.cs +++ b/OpenRA.Mods.RA/SupportPowers/NukePower.cs @@ -38,8 +38,10 @@ namespace OpenRA.Mods.RA return new SelectGenericPowerTarget(order, manager, "nuke", MouseButton.Left); } - public override void Activate(Actor self, Order order) + public override void Activate(Actor self, Order order, SupportPowerManager manager) { + base.Activate(self, order, manager); + if (self.Owner.IsAlliedWith(self.World.RenderPlayer)) Sound.Play(Info.LaunchSound); else diff --git a/OpenRA.Mods.RA/SupportPowers/ParatroopersPower.cs b/OpenRA.Mods.RA/SupportPowers/ParatroopersPower.cs index 85a764017d..8bf95cd3c1 100755 --- a/OpenRA.Mods.RA/SupportPowers/ParatroopersPower.cs +++ b/OpenRA.Mods.RA/SupportPowers/ParatroopersPower.cs @@ -33,8 +33,10 @@ namespace OpenRA.Mods.RA { public ParatroopersPower(Actor self, ParatroopersPowerInfo info) : base(self, info) { } - public override void Activate(Actor self, Order order) + public override void Activate(Actor self, Order order, SupportPowerManager manager) { + base.Activate(self, order, manager); + var items = (Info as ParatroopersPowerInfo).DropItems; var startPos = self.World.ChooseRandomEdgeCell(); diff --git a/OpenRA.Mods.RA/SupportPowers/SonarPulsePower.cs b/OpenRA.Mods.RA/SupportPowers/SonarPulsePower.cs index 3c65745a2a..621ff46278 100755 --- a/OpenRA.Mods.RA/SupportPowers/SonarPulsePower.cs +++ b/OpenRA.Mods.RA/SupportPowers/SonarPulsePower.cs @@ -18,8 +18,10 @@ namespace OpenRA.Mods.RA public class SonarPulsePower : SupportPower { public SonarPulsePower(Actor self, SonarPulsePowerInfo info) : base(self, info) { } - public override void Activate(Actor self, Order order) + public override void Activate(Actor self, Order order, SupportPowerManager manager) { + base.Activate(self, order, manager); + // TODO: Reveal submarines // Should this play for all players? diff --git a/OpenRA.Mods.RA/SupportPowers/SpyPlanePower.cs b/OpenRA.Mods.RA/SupportPowers/SpyPlanePower.cs index 722a504613..fde15507aa 100755 --- a/OpenRA.Mods.RA/SupportPowers/SpyPlanePower.cs +++ b/OpenRA.Mods.RA/SupportPowers/SpyPlanePower.cs @@ -25,8 +25,10 @@ namespace OpenRA.Mods.RA { public SpyPlanePower(Actor self, SpyPlanePowerInfo info) : base(self, info) { } - public override void Activate(Actor self, Order order) + public override void Activate(Actor self, Order order, SupportPowerManager manager) { + base.Activate(self, order, manager); + var enterCell = self.World.ChooseRandomEdgeCell(); var altitude = Rules.Info["u2"].Traits.Get().CruiseAltitude; diff --git a/OpenRA.Mods.RA/SupportPowers/SupportPower.cs b/OpenRA.Mods.RA/SupportPowers/SupportPower.cs index f55b13c043..6817ab41de 100755 --- a/OpenRA.Mods.RA/SupportPowers/SupportPower.cs +++ b/OpenRA.Mods.RA/SupportPowers/SupportPower.cs @@ -1,6 +1,6 @@ #region Copyright & License Information /* - * Copyright 2007-2011 The OpenRA Developers (see AUTHORS) + * 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, @@ -8,6 +8,7 @@ */ #endregion +using OpenRA.Mods.RA.Effects; using OpenRA.Traits; namespace OpenRA.Mods.RA @@ -45,6 +46,7 @@ namespace OpenRA.Mods.RA { public readonly Actor self; public readonly SupportPowerInfo Info; + protected Beacon beacon; public SupportPower(Actor self, SupportPowerInfo info) { @@ -62,7 +64,26 @@ namespace OpenRA.Mods.RA Sound.PlayToPlayer(self.Owner, Info.EndChargeSound); } - public virtual void Activate(Actor self, Order order) { } + public virtual void Activate(Actor self, Order order, SupportPowerManager manager) + { + if (Info.DisplayBeacon) + { + beacon = new Beacon( + order.Player, + order.TargetLocation.CenterPosition, + Info.BeaconDuration, + Info.BeaconPalettePrefix); + + self.World.Add(beacon); + } + + if (Info.DisplayRadarPing && manager.RadarPings != null) + manager.RadarPings.Value.Add( + () => order.Player.IsAlliedWith(self.World.RenderPlayer), + order.TargetLocation.CenterPosition, + order.Player.Color.RGB, + Info.BeaconDuration); + } public virtual IOrderGenerator OrderGenerator(string order, SupportPowerManager manager) { diff --git a/OpenRA.Mods.RA/SupportPowers/SupportPowerManager.cs b/OpenRA.Mods.RA/SupportPowers/SupportPowerManager.cs index 9a09541944..7369dfc21e 100755 --- a/OpenRA.Mods.RA/SupportPowers/SupportPowerManager.cs +++ b/OpenRA.Mods.RA/SupportPowers/SupportPowerManager.cs @@ -188,24 +188,10 @@ namespace OpenRA.Mods.RA var power = Instances.First(i => !InstanceDisabled(i)); // Note: order.Subject is the *player* actor - power.Activate(power.self, order); + power.Activate(power.self, order, Manager); RemainingTime = TotalTime; notifiedCharging = notifiedReady = false; - if (power.Info.DisplayBeacon) - power.self.World.Add(new Beacon( - order.Player, - order.TargetLocation.CenterPosition, - power.Info.BeaconDuration, - power.Info.BeaconPalettePrefix)); - - if (power.Info.DisplayRadarPing && Manager.RadarPings != null) - Manager.RadarPings.Value.Add( - () => order.Player.IsAlliedWith(power.self.World.RenderPlayer), - order.TargetLocation.CenterPosition, - order.Player.Color.RGB, - power.Info.BeaconDuration); - if (Info.OneShot) Disabled = true; }