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)); + } + } + } +}