diff --git a/OpenRa.Game/OpenRa.Game.csproj b/OpenRa.Game/OpenRa.Game.csproj index 876f551722..ee0dff883d 100644 --- a/OpenRa.Game/OpenRa.Game.csproj +++ b/OpenRa.Game/OpenRa.Game.csproj @@ -122,6 +122,7 @@ + diff --git a/OpenRa.Game/Orders/ChronoshiftDestinationOrderGenerator.cs b/OpenRa.Game/Orders/ChronoshiftDestinationOrderGenerator.cs index a2cd5ef75f..94b728793c 100644 --- a/OpenRa.Game/Orders/ChronoshiftDestinationOrderGenerator.cs +++ b/OpenRa.Game/Orders/ChronoshiftDestinationOrderGenerator.cs @@ -1,19 +1,20 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text; using System.Drawing; using OpenRa.Game.Traits; +using OpenRa.Game.SupportPowers; namespace OpenRa.Game.Orders { class ChronoshiftDestinationOrderGenerator : IOrderGenerator { public readonly Actor self; - - public ChronoshiftDestinationOrderGenerator(Actor self) + ISupportPowerImpl chronospherePower; + public ChronoshiftDestinationOrderGenerator(Actor self, ISupportPowerImpl chronospherePower) { this.self = self; + this.chronospherePower = chronospherePower; } public IEnumerable Order(int2 xy, MouseInput mi) @@ -23,8 +24,7 @@ namespace OpenRa.Game.Orders Game.controller.CancelInputMode(); yield break; } - - yield return new Order("Chronoshift", self, null, xy, null); + yield return new Order("Chronoshift", self, null, xy, null, chronospherePower); } public void Tick() {} diff --git a/OpenRa.Game/Orders/ChronosphereSelectOrderGenerator.cs b/OpenRa.Game/Orders/ChronosphereSelectOrderGenerator.cs index 4ff3de312d..ddafc11a6f 100644 --- a/OpenRa.Game/Orders/ChronosphereSelectOrderGenerator.cs +++ b/OpenRa.Game/Orders/ChronosphereSelectOrderGenerator.cs @@ -1,14 +1,20 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text; using OpenRa.Game.GameRules; using OpenRa.Game.Traits; +using OpenRa.Game.SupportPowers; namespace OpenRa.Game.Orders { class ChronosphereSelectOrderGenerator : IOrderGenerator { + ISupportPowerImpl chronospherePower; + public ChronosphereSelectOrderGenerator(ISupportPowerImpl chronospherePower) + { + this.chronospherePower = chronospherePower; + } + public IEnumerable Order(int2 xy, MouseInput mi) { if (mi.Button == MouseButton.Right) @@ -31,7 +37,7 @@ namespace OpenRa.Game.Orders if (unit != null) { - yield return new Order("ChronosphereSelect", underCursor, null, int2.Zero, null); + yield return new Order("ChronosphereSelect", underCursor, null, int2.Zero, null, chronospherePower); } } } diff --git a/OpenRa.Game/Orders/IronCurtainOrderGenerator.cs b/OpenRa.Game/Orders/IronCurtainOrderGenerator.cs index 286fef488b..261c2184df 100644 --- a/OpenRa.Game/Orders/IronCurtainOrderGenerator.cs +++ b/OpenRa.Game/Orders/IronCurtainOrderGenerator.cs @@ -1,18 +1,18 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text; using OpenRa.Game.GameRules; using OpenRa.Game.Traits; using OpenRa.Game.SupportPowers; + namespace OpenRa.Game.Orders { class IronCurtainOrderGenerator : IOrderGenerator { - ISupportPowerImpl power; - public IronCurtainOrderGenerator(ISupportPowerImpl power) + ISupportPowerImpl ironCurtainPower; + public IronCurtainOrderGenerator(ISupportPowerImpl ironCurtainPower) { - this.power = power; + this.ironCurtainPower = ironCurtainPower; } public IEnumerable Order(int2 xy, MouseInput mi) @@ -37,8 +37,7 @@ namespace OpenRa.Game.Orders if (unit != null) { - yield return new Order("IronCurtain", underCursor, this.power); - //yield return new Order("IronCurtain", underCursor, null, int2.Zero, null); + yield return new Order("IronCurtain", underCursor, null, int2.Zero, null, ironCurtainPower); } } } diff --git a/OpenRa.Game/Orders/Order.cs b/OpenRa.Game/Orders/Order.cs index 6caa67148d..d6c1d4933a 100644 --- a/OpenRa.Game/Orders/Order.cs +++ b/OpenRa.Game/Orders/Order.cs @@ -14,6 +14,9 @@ namespace OpenRa.Game public readonly string TargetString; public bool IsImmediate; + // This is a hack - fix me + public readonly ISupportPowerImpl SupportPowerImpl; + public Actor Subject { get { return ActorFromUInt(SubjectId); } } public Actor TargetActor { get { return ActorFromUInt(TargetActorId); } } public Player Player { get { return Subject.Owner; } } @@ -21,29 +24,27 @@ namespace OpenRa.Game public Order(string orderString, Actor subject, Actor targetActor, int2 targetLocation, string targetString) : this( orderString, UIntFromActor( subject ), - UIntFromActor( targetActor ), targetLocation, targetString ) {} + UIntFromActor( targetActor ), targetLocation, targetString, null ) {} + + public Order(string orderString, Actor subject, + Actor targetActor, int2 targetLocation, string targetString, ISupportPowerImpl power) + : this(orderString, UIntFromActor(subject), + UIntFromActor(targetActor), targetLocation, targetString, power) { } Order(string orderString, uint subjectId, uint targetActorId, int2 targetLocation, string targetString) + : this(orderString, subjectId, + targetActorId, targetLocation, targetString, null) { } + + Order(string orderString, uint subjectId, + uint targetActorId, int2 targetLocation, string targetString, ISupportPowerImpl power) { this.OrderString = orderString; this.SubjectId = subjectId; this.TargetActorId = targetActorId; this.TargetLocation = targetLocation; this.TargetString = targetString; - } - // This is a hack - fix me - public readonly ISupportPowerImpl Power; - public Order(string orderString, Actor subject, ISupportPowerImpl power) - { - this.OrderString = orderString; - this.SubjectId = UIntFromActor( subject ); - - this.Power = power; - - this.TargetActorId = UIntFromActor(null); - this.TargetLocation = int2.Zero; - this.TargetString = null; + this.SupportPowerImpl = power; } public bool Validate() diff --git a/OpenRa.Game/SupportPowers/ChronospherePower.cs b/OpenRa.Game/SupportPowers/ChronospherePower.cs new file mode 100644 index 0000000000..bab8c671eb --- /dev/null +++ b/OpenRa.Game/SupportPowers/ChronospherePower.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Drawing; +using OpenRa.Game.Orders; +using OpenRa.Game.Traits; + +namespace OpenRa.Game.SupportPowers +{ + class ChronospherePower : ISupportPowerImpl + { + public void IsReadyNotification(SupportPower p) { Sound.Play("chrordy1.aud"); } + public void IsChargingNotification(SupportPower p) { Sound.Play("chrochr1.aud"); } + + public void OnFireNotification(Actor target, int2 xy) + { + p.FinishActivate(); + Game.controller.CancelInputMode(); + + Sound.Play("chrono2.aud"); + + foreach (var a in Game.world.Actors.Where(a => a.traits.Contains())) + a.traits.Get().DoChronoshift(); + + // Play chronosphere active anim + var chronosphere = Game.world.Actors.Where(a => a.Owner == p.Owner && a.traits.Contains()).FirstOrDefault(); + + if (chronosphere != null) + chronosphere.traits.Get().PlayCustomAnim(chronosphere, "active"); + } + SupportPower p; + public void Activate(SupportPower p) + { + this.p = p; + Game.controller.orderGenerator = new ChronosphereSelectOrderGenerator(this); + Sound.Play("slcttgt1.aud"); + } + } +} diff --git a/OpenRa.Game/Traits/Chronoshiftable.cs b/OpenRa.Game/Traits/Chronoshiftable.cs index 7f86dca0be..d97bca1ec9 100644 --- a/OpenRa.Game/Traits/Chronoshiftable.cs +++ b/OpenRa.Game/Traits/Chronoshiftable.cs @@ -2,7 +2,6 @@ using OpenRa.Game.Orders; using System.Collections.Generic; using System.Linq; -using System.Drawing; namespace OpenRa.Game.Traits { @@ -40,7 +39,7 @@ namespace OpenRa.Game.Traits { if (order.OrderString == "ChronosphereSelect") { - Game.controller.orderGenerator = new ChronoshiftDestinationOrderGenerator(self); + Game.controller.orderGenerator = new ChronoshiftDestinationOrderGenerator(self, order.SupportPowerImpl); } var movement = self.traits.WithInterface().FirstOrDefault(); @@ -49,37 +48,26 @@ namespace OpenRa.Game.Traits // Cannot chronoshift into unexplored location if (!Game.LocalPlayer.Shroud.IsExplored(order.TargetLocation)) return; - + // Set up return-to-sender info chronoshiftOrigin = self.Location; chronoshiftReturnTicks = (int)(Rules.General.ChronoDuration * 60 * 25); - var chronosphere = Game.world.Actors.Where(a => a.Owner == order.Subject.Owner && a.traits.Contains()).FirstOrDefault(); - // Kill cargo if (Rules.General.ChronoKillCargo && self.traits.Contains()) { var cargo = self.traits.Get(); while (!cargo.IsEmpty(self)) { - if (chronosphere != null) - chronosphere.Owner.Kills++; + order.Player.Kills++; cargo.Unload(self); } } // Set up the teleport - Game.controller.CancelInputMode(); self.CancelActivity(); self.QueueActivity(new Activities.Teleport(order.TargetLocation)); - Sound.Play("chrono2.aud"); - - foreach (var a in Game.world.Actors.Where(a => a.traits.Contains())) - a.traits.Get().DoChronoshift(); - - // Play chronosphere active anim - if (chronosphere != null) - chronosphere.traits.Get().PlayCustomAnim(chronosphere, "active"); + order.SupportPowerImpl.OnFireNotification(self, self.Location); } } diff --git a/OpenRa.Game/Traits/IronCurtainable.cs b/OpenRa.Game/Traits/IronCurtainable.cs index e49ace50a3..a6663f1466 100644 --- a/OpenRa.Game/Traits/IronCurtainable.cs +++ b/OpenRa.Game/Traits/IronCurtainable.cs @@ -28,7 +28,7 @@ namespace OpenRa.Game.Traits { if (order.OrderString == "IronCurtain") { - order.Power.OnFireNotification(self, self.Location); + order.SupportPowerImpl.OnFireNotification(self, self.Location); Game.world.AddFrameEndTask(w => w.Add(new InvulnEffect(self))); RemainingTicks = (int)(Rules.General.IronCurtain * 60 * 25); } diff --git a/units.ini b/units.ini index 43af439a17..b985f2f3ab 100644 --- a/units.ini +++ b/units.ini @@ -861,7 +861,7 @@ LongDesc=Temporarily teleports a vehicle across \nthe map. Prerequisite=PDOX Image=warpicon TechLevel=12 -Impl=NullPower +Impl=ChronospherePower [SpyPlanePower] ; free with first AFLD ChargeTime=3