public static bool IsVisible(MPos position)
        {
            if (map == null)
            {
                return(false);
            }

            if (shroud.RevealAll)
            {
                return(true);
            }

            if (!position.InRange(lastCameraPosition, lastCameraPosition + lastCameraZoom))
            {
                return(false);
            }

            return(visible[position.X, position.Y]);
        }
        public static bool IsVisibleIgnoringBounds(MPos position)
        {
            if (map == null)
            {
                return(false);
            }

            if (shroud.RevealAll)
            {
                return(true);
            }

            if (!position.InRange(lastCameraPosition, lastCameraPosition + lastCameraZoom))
            {
                return(false);
            }

            if (position.X < 0)
            {
                position = new MPos(0, position.Y);
            }
            else if (position.X >= mapBounds.X)
            {
                position = new MPos(mapBounds.X - 1, position.Y);
            }

            if (position.Y < 0)
            {
                position = new MPos(position.X, 0);
            }
            else if (position.Y >= mapBounds.Y)
            {
                position = new MPos(position.X, mapBounds.Y - 1);
            }

            return(visible[position.X, position.Y]);
        }
        void generateSingle(MPos start, MPos end)
        {
            var currentPosition = start;

            while (currentPosition != end)
            {
                var angle = end.AngleTo(currentPosition);
                var optX  = MathF.Cos(angle);
                var x     = (Math.Abs(optX) > 0.25f ? 1 : 0) * Math.Sign(optX);

                var optY = MathF.Sin(angle);
                var y    = (Math.Abs(optY) > 0.25f ? 1 : 0) * Math.Sign(optY);

                // Maximal abeviation of +-45°
                if (info.Curvy)
                {
                    MPos a1 = MPos.Zero;
                    MPos a2 = MPos.Zero;
                    // Get the two other possibilities near the best tone
                    if (x != 0 && y != 0)
                    {
                        a1 = new MPos(x, 0) + currentPosition;
                        a2 = new MPos(0, y) + currentPosition;
                    }
                    if (x == 0)
                    {
                        a1 = new MPos(1, y) + currentPosition;
                        a2 = new MPos(-1, y) + currentPosition;
                    }
                    if (y == 0)
                    {
                        a1 = new MPos(x, 1) + currentPosition;
                        a2 = new MPos(x, -1) + currentPosition;
                    }
                    MPos preferred = new MPos(x, y) + currentPosition;

                    // If out of bounds, make the value high af so the field can't be taken
                    var val1 = preferred.InRange(MPos.Zero, Bounds) ? noise[preferred.X, preferred.Y] : 10f;
                    var val2 = a1.InRange(MPos.Zero, Bounds) ? noise[a1.X, a1.Y] : 10f;
                    var val3 = a2.InRange(MPos.Zero, Bounds) ? noise[a2.X, a2.Y] : 10f;

                    if (preferred != end)
                    {
                        if (val2 < val3 && val2 < val1 || a1 == end)
                        {
                            preferred = a1;
                        }
                        else if (val3 < val2 && val3 < val1 || a2 == end)
                        {
                            preferred = a2;
                        }
                    }

                    currentPosition = preferred;
                }
                else
                {
                    currentPosition += new MPos(x, y);
                }

                points.Add(currentPosition);
            }
        }