diff --git a/OpenRA.Game/Map/Map.cs b/OpenRA.Game/Map/Map.cs index c733e3d90e..acbcedc433 100644 --- a/OpenRA.Game/Map/Map.cs +++ b/OpenRA.Game/Map/Map.cs @@ -870,7 +870,7 @@ namespace OpenRA // it rounds the actual distance up to the next integer so that this call // will return any cells that intersect with the requested range circle. // The returned positions are sorted by distance from the center. - public IEnumerable FindTilesInAnnulus(CPos center, int minRange, int maxRange) + public IEnumerable FindTilesInAnnulus(CPos center, int minRange, int maxRange, bool allowOutsideBounds = false) { if (maxRange < minRange) throw new ArgumentOutOfRangeException("maxRange", "Maximum range is less than the minimum range."); @@ -878,20 +878,24 @@ namespace OpenRA if (maxRange > TilesByDistance.Length) throw new ArgumentOutOfRangeException("maxRange", "The requested range ({0}) exceeds the maximum allowed ({1})".F(maxRange, MaxTilesInCircleRange)); + Func valid = Contains; + if (allowOutsideBounds) + valid = MapTiles.Value.Contains; + for (var i = minRange; i <= maxRange; i++) { foreach (var offset in TilesByDistance[i]) { var t = offset + center; - if (Contains(t)) + if (valid(t)) yield return t; } } } - public IEnumerable FindTilesInCircle(CPos center, int maxRange) + public IEnumerable FindTilesInCircle(CPos center, int maxRange, bool allowOutsideBounds = false) { - return FindTilesInAnnulus(center, 0, maxRange); + return FindTilesInAnnulus(center, 0, maxRange, allowOutsideBounds); } } } diff --git a/OpenRA.Game/Traits/World/Shroud.cs b/OpenRA.Game/Traits/World/Shroud.cs index 3c718ec491..452bea039f 100644 --- a/OpenRA.Game/Traits/World/Shroud.cs +++ b/OpenRA.Game/Traits/World/Shroud.cs @@ -112,7 +112,7 @@ namespace OpenRA.Traits var limit = radius.RangeSquared; var pos = map.CenterOfCell(position); - foreach (var cell in map.FindTilesInCircle(position, r)) + foreach (var cell in map.FindTilesInCircle(position, r, true)) if ((map.CenterOfCell(cell) - pos).HorizontalLengthSquared <= limit) yield return cell; } @@ -129,6 +129,11 @@ namespace OpenRA.Traits foreach (var c in visible) { var uv = c.ToMPos(map); + + // Force cells outside the visible bounds invisible + if (!map.Contains(uv)) + continue; + visibleCount[uv]++; explored[uv] = true; } @@ -147,7 +152,11 @@ namespace OpenRA.Traits return; foreach (var c in visible) - visibleCount[c.ToMPos(map)]--; + { + // Cells outside the visible bounds don't increment visibleCount + if (map.Contains(c)) + visibleCount[c.ToMPos(map)]--; + } visibility.Remove(a); Invalidate(visible);