public override void ComputeFieldOfVision(Map map, Levels.Position observer, int visionRange) { this.Observer = observer; clear(); if (visionRange > 0) { for (int i = -1; i <= 1; ++i) { for (int j = -1; j <= 1; ++j) { this[i, j] = true; } } } if (visionRange > 1) { this[-2, -2] = Map.IsTransparent(map[observer.X - 1, observer.Y - 1]); this[-2, 2] = Map.IsTransparent(map[observer.X - 1, observer.Y + 1]); this[2, -2] = Map.IsTransparent(map[observer.X + 1, observer.Y - 1]); this[2, 2] = Map.IsTransparent(map[observer.X + 1, observer.Y + 1]); this[-2, 0] = this[-2, -1] = this[-2, 1] = Map.IsTransparent(map[observer.X - 1, observer.Y]); this[2, 0] = this[2, -1] = this[2, 1] = Map.IsTransparent(map[observer.X + 1, observer.Y]); this[0, -2] = this[1, -2] = this[-1, -2] = Map.IsTransparent(map[observer.X, observer.Y - 1]); this[0, 2] = this[1, 2] = this[-1, 2] = Map.IsTransparent(map[observer.X, observer.Y + 1]); } }
public override void ComputeFieldOfVision(Map map, Levels.Position observer, int visionRange) { if (visionRange > MAX_VISION_RANGE || visionRange < 0) { throw new ArgumentOutOfRangeException("visionRange out of range"); } clear(); for (int i = -MAX_VISION_RANGE; i <= MAX_VISION_RANGE; ++i) { for (int j = -MAX_VISION_RANGE; j <= MAX_VISION_RANGE; ++j) { this[i, j] = true; } } }
public override void ComputeFieldOfVision(Map map, Levels.Position observer, int visionRange) { this.Observer = observer; clear(); if (visionRange > 0) { this[0, 0] = true; } for (int i = -visionRange; i <= visionRange; ++i) { int x = 0; int y = 0; int it = 0; int adjacency = 0; while (x * x + y * y < visionRange * visionRange) { it++; x--; y = (i * it) / visionRange; this[x, y] = true; if (y > 0) { adjacency = -1; } if (y < 0) { adjacency = 1; } if (!Map.IsTransparent(map[observer.X + x, observer.Y + y])) { int q = 0; while (Map.IsTransparent(map[observer.X + x - q, observer.Y + y + adjacency]) && (x - 1 - q) * (x - 1 - q) + y * y < visionRange * visionRange) { this[x - 1 - q, y] = true; q++; } break; } } } for (int i = -visionRange; i <= visionRange; ++i) { int x = 0; int y = 0; int it = 0; int adjacency = 0; while (x * x + y * y < visionRange * visionRange) { it++; x++; y = (i * it) / visionRange; this[x, y] = true; if (y > 0) { adjacency = -1; } if (y < 0) { adjacency = 1; } if (!Map.IsTransparent(map[observer.X + x, observer.Y + y])) { int q = 0; while (Map.IsTransparent(map[observer.X + x + q, observer.Y + y + adjacency]) && (x + 1 + q) * (x + 1 + q) + y * y < visionRange * visionRange) { this[x + 1 + q, y] = true; q++; } break; } } } for (int i = -visionRange; i <= visionRange; ++i) { int x = 0; int y = 0; int it = 0; int adjacency = 0; while (x * x + y * y < visionRange * visionRange) { it++; y--; x = (i * it) / visionRange; this[x, y] = true; if (x > 0) { adjacency = -1; } if (x < 0) { adjacency = 1; } if (!Map.IsTransparent(map[observer.X + x, observer.Y + y])) { int q = 0; while (Map.IsTransparent(map[observer.X + x + adjacency, observer.Y + y - q]) && x * x + (y - q) * (y - q) < visionRange * visionRange) { this[x, y - 1 - q] = true; q++; } break; } } } for (int i = -visionRange; i <= visionRange; ++i) { int x = 0; int y = 0; int it = 0; int adjacency = 0; while (x * x + y * y < visionRange * visionRange) { it++; y++; x = (i * it) / visionRange; this[x, y] = true; if (x > 0) { adjacency = -1; } if (x < 0) { adjacency = 1; } if (!Map.IsTransparent(map[observer.X + x, observer.Y + y])) { int q = 0; while (Map.IsTransparent(map[observer.X + x + adjacency, observer.Y + y + q]) && x * x + (y + q) * (y + q) < visionRange * visionRange) { this[x, y + 1 + q] = true; q++; } break; } } } }