diff --git a/OpenRA.Game/Graphics/WorldRenderer.cs b/OpenRA.Game/Graphics/WorldRenderer.cs
index 56b761712f..9060345e80 100644
--- a/OpenRA.Game/Graphics/WorldRenderer.cs
+++ b/OpenRA.Game/Graphics/WorldRenderer.cs
@@ -341,31 +341,33 @@ namespace OpenRA.Graphics
}
}
- public void DrawRangeCircle(Actor selectedUnit)
+ public void DrawRangeCircle(Color c, int2 location, int range)
{
- if (selectedUnit.Owner != world.LocalPlayer)
- return;
-
- var range = (int)selectedUnit.GetPrimaryWeapon().Range;
var r2 = range * range;
- var c = Color.FromArgb(128, Color.Yellow);
-
- foreach (var t in world.FindTilesInCircle(selectedUnit.Location, range))
+ foreach (var t in world.FindTilesInCircle(location, range))
{
- if ((selectedUnit.Location - t - new int2(-1, 0)).LengthSquared > r2)
+ if ((location - t - new int2(-1, 0)).LengthSquared > r2)
lineRenderer.DrawLine(Game.CellSize * t, Game.CellSize * (t + new int2(0, 1)),
- c,c);
- if ((selectedUnit.Location - t - new int2(1, 0)).LengthSquared > r2)
- lineRenderer.DrawLine(Game.CellSize * (t + new int2(1,0)), Game.CellSize * (t + new int2(1, 1)),
- c,c);
- if ((selectedUnit.Location - t - new int2(0,-1)).LengthSquared > r2)
- lineRenderer.DrawLine(Game.CellSize * t, Game.CellSize * (t + new int2(1,0)),
- c,c);
- if ((selectedUnit.Location - t - new int2(0,1)).LengthSquared > r2)
- lineRenderer.DrawLine(Game.CellSize * (t + new int2(0,1)), Game.CellSize * (t + new int2(1, 1)),
- c,c);
+ c, c);
+ if ((location - t - new int2(1, 0)).LengthSquared > r2)
+ lineRenderer.DrawLine(Game.CellSize * (t + new int2(1, 0)), Game.CellSize * (t + new int2(1, 1)),
+ c, c);
+ if ((location - t - new int2(0, -1)).LengthSquared > r2)
+ lineRenderer.DrawLine(Game.CellSize * t, Game.CellSize * (t + new int2(1, 0)),
+ c, c);
+ if ((location - t - new int2(0, 1)).LengthSquared > r2)
+ lineRenderer.DrawLine(Game.CellSize * (t + new int2(0, 1)), Game.CellSize * (t + new int2(1, 1)),
+ c, c);
}
}
+
+ public void DrawRangeCircle(Actor selectedUnit)
+ {
+ if (selectedUnit.Owner == world.LocalPlayer)
+ DrawRangeCircle(Color.FromArgb(128, Color.Yellow),
+ selectedUnit.Location,
+ (int)selectedUnit.GetPrimaryWeapon().Range);
+ }
}
}
diff --git a/OpenRA.Game/OpenRA.Game.csproj b/OpenRA.Game/OpenRA.Game.csproj
index f7777d7a4a..203a5b3f6c 100755
--- a/OpenRA.Game/OpenRA.Game.csproj
+++ b/OpenRA.Game/OpenRA.Game.csproj
@@ -85,6 +85,7 @@
+
@@ -268,7 +269,7 @@
-
+
diff --git a/OpenRA.Game/Orders/UnitOrderGenerator.cs b/OpenRA.Game/Orders/UnitOrderGenerator.cs
index 9f5f5f56d5..208432a8e5 100644
--- a/OpenRA.Game/Orders/UnitOrderGenerator.cs
+++ b/OpenRA.Game/Orders/UnitOrderGenerator.cs
@@ -51,8 +51,16 @@ namespace OpenRA.Orders
foreach (var a in Game.controller.selection.Actors)
{
world.WorldRenderer.DrawSelectionBox(a, Color.White, true);
- if (a.traits.Contains())
- world.WorldRenderer.DrawRangeCircle(a);
+ if (a.Owner == world.LocalPlayer)
+ {
+ if (a.traits.Contains())
+ world.WorldRenderer.DrawRangeCircle(Color.FromArgb(128, Color.Yellow),
+ a.Location, (int)a.GetPrimaryWeapon().Range);
+
+ if (a.traits.Contains())
+ world.WorldRenderer.DrawRangeCircle(Color.FromArgb(128, Color.LimeGreen),
+ a.Location, a.Info.Traits.Get().Range);
+ }
}
}
diff --git a/OpenRA.Game/Traits/Submarine.cs b/OpenRA.Game/Traits/Cloak.cs
similarity index 92%
rename from OpenRA.Game/Traits/Submarine.cs
rename to OpenRA.Game/Traits/Cloak.cs
index c9cb9528bb..2cc7c9fed8 100644
--- a/OpenRA.Game/Traits/Submarine.cs
+++ b/OpenRA.Game/Traits/Cloak.cs
@@ -86,5 +86,11 @@ namespace OpenRA.Traits
}
public bool Cloaked { get { return remainingTime > 0; } }
+
+ public void Decloak(int time)
+ {
+ DoSurface();
+ remainingTime = Math.Max(remainingTime, time);
+ }
}
}
diff --git a/OpenRA.Game/Traits/DetectCloaked.cs b/OpenRA.Game/Traits/DetectCloaked.cs
new file mode 100644
index 0000000000..db70bb4ca2
--- /dev/null
+++ b/OpenRA.Game/Traits/DetectCloaked.cs
@@ -0,0 +1,52 @@
+#region Copyright & License Information
+/*
+ * Copyright 2007,2009,2010 Chris Forbes, Robert Pepperell, Matthew Bowra-Dean, Paul Chote, Alli Witheford.
+ * This file is part of OpenRA.
+ *
+ * OpenRA is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * OpenRA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with OpenRA. If not, see .
+ */
+#endregion
+
+using System.Linq;
+
+namespace OpenRA.Traits
+{
+ class DetectCloakedInfo : TraitInfo
+ {
+ public readonly int Interval = 12; // ~.5s
+ public readonly float DecloakTime = 2f; // 2s
+ public readonly int Range = 5;
+ }
+
+ class DetectCloaked : ITick
+ {
+ [Sync] int ticks;
+
+ public void Tick(Actor self)
+ {
+ if (--ticks <= 0)
+ {
+ var info = self.Info.Traits.Get();
+ ticks = info.Interval;
+
+ var toDecloak = self.World.FindUnitsInCircle(self.CenterLocation, info.Range * Game.CellSize)
+ .Where(a => a.traits.Contains())
+ .Where(a => a.Owner.Stances[self.Owner] != Stance.Ally);
+
+ foreach (var a in toDecloak)
+ a.traits.Get().Decloak((int)(25 * info.DecloakTime));
+ }
+ }
+ }
+}