public void ContainsTest()
        {
            Assert.IsTrue(_map.Contains(new Coord(0, 0)));
            Assert.IsTrue(_map.Contains(new Coord(1, 1)));
            Assert.IsTrue(_map.Contains(new Coord(7, 0)));
            Assert.IsTrue(_map.Contains(new Coord(0, 7)));
            Assert.IsTrue(_map.Contains(new Coord(7, 7)));
            Assert.IsTrue(_map.Contains(new Coord(5, 5)));

            Assert.IsFalse(_map.Contains(new Coord(8, 8)));
            Assert.IsFalse(_map.Contains(new Coord(-1, 5)));
            Assert.IsFalse(_map.Contains(new Coord(5, 19)));
            Assert.IsFalse(_map.Contains(new Coord(9, 4)));
        }
Пример #2
0
        public static bool IsClearOfObstructions(this BasicMap m, Coord origin, int width)
        {
            for (int i = origin.X; i < origin.X + width; i++)
            {
                for (int j = origin.Y; j < origin.Y + width; j++)
                {
                    Coord c = new Coord(i, j);
                    if (m.Contains(c))
                    {
                        BasicTerrain t = m.GetTerrain <BasicTerrain>(c);
                        if (t != null)
                        {
                            if (!t.IsWalkable)
                            {
                                return(false);
                            }
                            else if (Equals(_factory.Pavement(c), _factory.Copy(t, c))) //todo: fix this shit
                            {
                                return(false);
                            }
                        }
                    }
                }
            }

            return(true);
        }
Пример #3
0
        public static BasicMap CropToContent(this BasicMap m)
        {
            int minX = m.Width;
            int maxX = 0;
            int minY = m.Height;
            int maxY = 0;

            for (int x = 0; x < m.Width; x++)
            {
                for (int y = 0; y < m.Height; y++)
                {
                    if (m.GetTerrain <BasicTerrain>(new Coord(x, y)) != null)
                    {
                        if (minX > x)
                        {
                            minX = x;
                        }
                        if (minY > y)
                        {
                            minY = y;
                        }
                        if (maxX < x)
                        {
                            maxX = x;
                        }
                        if (maxY < y)
                        {
                            maxY = y;
                        }
                    }
                }
            }

            int   dx     = Math.Abs(maxX - minX + 1);
            int   dy     = Math.Abs(maxY - minY + 1);
            Coord offset = new Coord(-minX, -minY);

            BasicMap map = new BasicMap(dx, dy, EnumUtils.EnumLength <MapLayer>(), Distance.EUCLIDEAN);

            map.ForXForY((point) =>
            {
                if (m.Contains(point - offset))
                {
                    BasicTerrain terrain = m.GetTerrain <BasicTerrain>(point - offset);
                    if (terrain != null)
                    {
                        map.SetTerrain(_factory.Copy(terrain, point));
                    }
                }
            });

            return(map);
        }
Пример #4
0
        public static BasicMap Rotate(this BasicMap m, Coord origin, int radius, int degrees)
        {
            BasicMap rotated = new BasicMap(m.Width, m.Height, 1, Distance.EUCLIDEAN);

            //only rotating the bottom right corner, and not even rotating it correctly
            if (degrees % 90 == 0)
            {
                //this rotates more than just the circle - bug, deal with it later
                rotated.Add(m.RotateDiscreet(degrees));
            }
            else
            {
                BasicMap map = m.RotateDiscreet(360);
                while (degrees > 45)
                {
                    degrees -= 90;
                    //rotates more than just this circle - bug - deal with it later
                    map = m.RotateDiscreet(90);
                }
                while (degrees <= -45)
                {
                    degrees += 90;
                    //rotates more than just the circle - bug, fix later
                    map = m.RotateDiscreet(270);
                }
                double radians = Calculate.DegreesToRadians(degrees);

                for (int x = -radius; x < radius; x++)
                {
                    for (int y = -radius; y < radius; y++)
                    {
                        if (radius > Math.Sqrt(x * x + y * y))
                        {
                            int          xPrime  = (int)(x * Math.Cos(radians) - y * Math.Sin(radians));
                            int          yPrime  = (int)(x * Math.Sin(radians) + y * Math.Cos(radians));
                            Coord        source  = new Coord(x, y) + origin;
                            Coord        target  = new Coord(xPrime, yPrime) + origin;
                            BasicTerrain terrain = map.GetTerrain <BasicTerrain>(source);
                            if (terrain != null && rotated.Contains(target))
                            {
                                rotated.SetTerrain(_factory.Copy(terrain, target));
                            }
                        }
                    }
                }
            }
            return(rotated);
        }
Пример #5
0
 public static void ReplaceTiles(this BasicMap m, BasicMap map, Coord origin)
 {
     for (int i = 0; i < map.Width; i++)
     {
         for (int j = 0; j < map.Height; j++)
         {
             Coord        target = new Coord(i + origin.X, j + origin.Y);
             BasicTerrain t      = map.GetTerrain <BasicTerrain>(new Coord(i, j));
             if (t != null && m.Contains(target))
             {
                 t = _factory.Copy(t, target);
                 m.SetTerrain(t);
             }
         }
     }
 }
Пример #6
0
 public static void Add(this BasicMap m, BasicMap map, Coord origin)
 {
     if (m.Width < map.Width + origin.X && m.Height < map.Height + origin.X)
     {
         throw new ArgumentOutOfRangeException(nameof(origin));
     }
     for (int i = 0; i < map.Width; i++)
     {
         for (int j = 0; j < map.Height; j++)
         {
             Coord        target = new Coord(i + origin.X, j + origin.Y);
             BasicTerrain t1     = (BasicTerrain)map.GetTerrain(new Coord(i, j));
             BasicTerrain t2     = (BasicTerrain)m.GetTerrain(new Coord(i, j));
             if (t1 != null && t2 == null && m.Contains(target))
             {
                 t1 = _factory.Copy(t1, target);
                 m.SetTerrain(t1);
             }
         }
     }
 }
Пример #7
0
        public static BasicMap Subsection(this BasicMap m, Coord start, Coord stop)
        {
            int      xDiff = stop.X - start.X;
            int      yDiff = stop.Y - start.Y;
            BasicMap map   = new BasicMap(xDiff, yDiff, Enum.GetNames(typeof(MapLayer)).Length, Distance.MANHATTAN);

            for (int i = start.X; i < stop.X + 1; i++)
            {
                for (int j = start.Y; j < stop.Y + 1; j++)
                {
                    BasicTerrain t = m.GetTerrain <BasicTerrain>(new Coord(i, j));
                    if (t != null)
                    {
                        Coord c = new Coord(i - start.X, j - start.Y);
                        t = _factory.Copy(t, c);
                        if (map.Contains(c))
                        {
                            map.SetTerrain(t);
                        }
                    }
                }
            }
            return(map);
        }