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