private static bool IsPointOutsideRedline(this PointFT start)
        {
            var nearestRedLine = GameGrid.RedPoints.OrderBy(p => p.DistanceSq(start)).First();
            var distance       = start.DistanceSq(nearestRedLine);

            if (distance == 0)
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }
        private void GenerateDeployPointsFromMinesToMilk(CacheBehavior behavior = CacheBehavior.Default)
        {
            // Find all mines
            List <Building> mines = new List <Building>();
            TownHall        th    = TownHall.Find();

            if (th != null)
            {
                mines.Add(th);
            }
            if (!resourcesFull.HasFlag(ResourcesFull.Gold))
            {
                mines.AddRange(GoldMine.Find(behavior));
            }
            if (!resourcesFull.HasFlag(ResourcesFull.Elixir))
            {
                mines.AddRange(ElixirCollector.Find(behavior));
            }
            if (!resourcesFull.HasFlag(ResourcesFull.Delixir))
            {
                mines.AddRange(DarkElixirDrill.Find(behavior));
            }

            List <PointFT> resultPoints = new List <PointFT>();

            foreach (Building mine in mines)
            {
                PointFT center     = mine.Location.GetCenter();
                PointFT closest    = GameGrid.RedPoints.OrderBy(p => p.DistanceSq(center)).First();
                float   distanceSq = center.DistanceSq(closest);
                Log.Debug("DistanceSq from " + mine.GetType().Name + " to red point: " + distanceSq.ToString("F1"));
                if (distanceSq < 9)  // 3 tiles (squared = 9) means there is no wall or building between us and the collector
                {
                    Log.Debug("Adding deploy point");
                    PointFT awayFromRedLine = closest.AwayFrom(center, 0.5f);
                    resultPoints.Add(awayFromRedLine);
                }
            }
            Log.Debug("Found " + resultPoints.Count + " deploy points");
            deployPoints = resultPoints.ToArray();
        }