Пример #1
0
        public static Polygon getEdgeBorder(Rectangle room, Random mineRandom, List <Rectangle> smoothZone, int horizontalInwardLimit, int verticalInwardLimit)
        {
            if (smoothZone == null)
            {
                smoothZone = new List <Rectangle>();
            }
            int lakeAreaWidth  = room.Width - 2;
            int lakeAreaHeight = room.Height - 2;
            int lakeXPosition  = room.X + 1;
            int lakeYPosition  = room.Y + 1;

            new Rectangle(lakeXPosition, lakeYPosition, lakeAreaWidth, lakeAreaHeight);
            Polygon lake         = new Polygon();
            Vector2 lastPosition = new Vector2(mineRandom.Next(lakeXPosition + 5, lakeXPosition + 8), mineRandom.Next(lakeYPosition + 5, lakeYPosition + 8));

            lake.Lines.Add(new Line(lastPosition, new Vector2(lastPosition.X + 1f, lastPosition.Y)));
            lastPosition.X += 1f;
            int        topWidth      = lakeAreaWidth - 12;
            List <int> lastDirection = new List <int>
            {
                2,
                2,
                2
            };
            int m = 0;

            while (m < topWidth)
            {
                int whichWayToGo = mineRandom.Next(3);
                if (lastDirection.Last() != whichWayToGo && lastDirection[lastDirection.Count - 2] != lastDirection.Last())
                {
                    whichWayToGo = lastDirection.Last();
                }
                if (whichWayToGo == 0 && lastPosition.Y > (float)lakeYPosition && !lastDirection.Contains(1))
                {
                    lastPosition.Y -= 1f;
                    lastDirection.Add(0);
                }
                else if (whichWayToGo == 1 && lastPosition.Y < (float)(lakeYPosition + verticalInwardLimit) && !lastDirection.Contains(0))
                {
                    lastPosition.Y += 1f;
                    lastDirection.Add(1);
                }
                else
                {
                    lastPosition.X += 1f;
                    m++;
                    lastDirection.Add(2);
                }
                lastDirection.RemoveAt(0);
                lake.addPoint(lastPosition);
            }
            int rightWidth = lakeAreaHeight - 4 - (int)(lastPosition.Y - (float)room.Y);

            lastPosition.Y += 1f;
            lastDirection   = new List <int>
            {
                2,
                2,
                2
            };
            lake.addPoint(lastPosition);
            int l = 0;

            while (l < rightWidth)
            {
                int whichWayToGo2 = mineRandom.Next(3);
                if (lastDirection.Last() != whichWayToGo2 && lastDirection[lastDirection.Count - 2] != lastDirection.Last())
                {
                    whichWayToGo2 = lastDirection.Last();
                }
                if (l > 4 && whichWayToGo2 == 0 && lastPosition.X < (float)(lakeXPosition + lakeAreaWidth - 1) && !lastDirection.Contains(1) && !Utility.pointInRectangles(smoothZone, (int)lastPosition.X, (int)lastPosition.Y))
                {
                    lastPosition.X += 1f;
                    lastDirection.Add(0);
                }
                else if (l > 4 && whichWayToGo2 == 1 && lastPosition.X > (float)(lakeXPosition + lakeAreaWidth - horizontalInwardLimit + 1) && !lastDirection.Contains(0) && !Utility.pointInRectangles(smoothZone, (int)lastPosition.X, (int)lastPosition.Y))
                {
                    lastPosition.X -= 1f;
                    lastDirection.Add(1);
                }
                else
                {
                    lastPosition.Y += 1f;
                    l++;
                    lastDirection.Add(2);
                }
                lastDirection.RemoveAt(0);
                lake.addPoint(lastPosition);
            }
            int bottomWidth = (int)lastPosition.X - (int)lake.Lines[0].Start.X + 1;

            lastPosition.X -= 1f;
            lastDirection   = new List <int>
            {
                2,
                2,
                2
            };
            lake.addPoint(lastPosition);
            int k = 0;

            while (k < bottomWidth)
            {
                int whichWayToGo3 = mineRandom.Next(3);
                if (lastDirection.Last() != whichWayToGo3 && lastDirection[lastDirection.Count - 2] != lastDirection.Last())
                {
                    whichWayToGo3 = lastDirection.Last();
                }
                if (k > 4 && whichWayToGo3 == 0 && lastPosition.Y > (float)(lakeYPosition + lakeAreaHeight - verticalInwardLimit) && !lastDirection.Contains(1) && !lake.containsPoint(new Vector2(lastPosition.X, lastPosition.Y - 1f)))
                {
                    lastPosition.Y -= 1f;
                    lastDirection.Add(0);
                }
                else if (k > 4 && whichWayToGo3 == 1 && lastPosition.Y < (float)(lakeYPosition + lakeAreaHeight) && !lastDirection.Contains(0))
                {
                    lastPosition.Y += 1f;
                    lastDirection.Add(1);
                }
                else
                {
                    lastPosition.X -= 1f;
                    k++;
                    lastDirection.Add(2);
                }
                lastDirection.RemoveAt(0);
                lake.addPoint(lastPosition);
            }
            int leftWidth = (int)lastPosition.Y - (int)lake.Lines[0].Start.Y - 1;

            lastPosition.Y -= 1f;
            lastDirection   = new List <int>
            {
                2,
                2,
                2
            };
            lake.addPoint(lastPosition);
            int j = 0;

            while (j < leftWidth)
            {
                int whichWayToGo4 = mineRandom.Next(3);
                if (lastDirection.Last() != whichWayToGo4 && lastDirection[lastDirection.Count - 2] != lastDirection.Last())
                {
                    whichWayToGo4 = lastDirection.Last();
                }
                if (j > 4 && whichWayToGo4 == 0 && lastPosition.X < (float)(int)lake.Lines[0].Start.X && !lastDirection.Contains(1) && !lake.containsPoint(new Vector2(lastPosition.X + 1f, lastPosition.Y)) && !lake.containsPoint(new Vector2(lastPosition.X, lastPosition.Y - 1f)) && !Utility.pointInRectangles(smoothZone, (int)lastPosition.X, (int)lastPosition.Y))
                {
                    lastPosition.X += 1f;
                    lastDirection.Add(0);
                }
                else if (j > 4 && whichWayToGo4 == 1 && lastPosition.X > (float)(lakeXPosition + 1) && !lastDirection.Contains(0) && !Utility.pointInRectangles(smoothZone, (int)lastPosition.X, (int)lastPosition.Y))
                {
                    lastPosition.X -= 1f;
                    lastDirection.Add(1);
                }
                else
                {
                    lastPosition.Y -= 1f;
                    j++;
                    lastDirection.Add(2);
                }
                lastDirection.RemoveAt(0);
                lake.addPoint(lastPosition);
            }
            if (lastPosition.X < (float)(int)lake.Lines[0].Start.X)
            {
                int leftover = (int)lake.Lines[0].Start.X + 1 - (int)lastPosition.X - 1;
                for (int i = 0; i < leftover; i++)
                {
                    lastPosition.X += 1f;
                    lake.addPoint(lastPosition);
                }
            }
            return(lake);
        }
Пример #2
0
        public static Polygon getRandomBorderRoom(Rectangle room, Random mineRandom)
        {
            int lakeAreaWidth  = room.Width - 2;
            int lakeAreaHeight = room.Height - 2;
            int lakeXPosition  = room.X + 1;
            int lakeYPosition  = room.Y + 1;

            new Rectangle(lakeXPosition, lakeYPosition, lakeAreaWidth, lakeAreaHeight);
            Polygon lake         = new Polygon();
            Vector2 lastPosition = new Vector2(mineRandom.Next(lakeXPosition + 5, lakeXPosition + 8), mineRandom.Next(lakeYPosition + 5, lakeYPosition + 8));

            lake.Lines.Add(new Line(lastPosition, new Vector2(lastPosition.X + 1f, lastPosition.Y)));
            lastPosition.X += 1f;
            int topWidth      = room.Right - (int)lastPosition.X - lakeAreaWidth / 8;
            int lastDirection = 2;
            int m             = 0;

            while (m < topWidth)
            {
                int whichWayToGo = mineRandom.Next(3);
                if ((whichWayToGo == 0 && lastPosition.Y > (float)room.Y && lastDirection != 1) || (lastDirection == 2 && lastPosition.Y >= (float)(lakeYPosition + lakeAreaHeight / 2)))
                {
                    lastPosition.Y -= 1f;
                    lastDirection   = 0;
                }
                else if ((whichWayToGo == 1 && lastPosition.Y < (float)(lakeYPosition + lakeAreaHeight / 2) && lastDirection != 0) || (lastDirection == 2 && lastPosition.Y <= (float)room.Y))
                {
                    lastPosition.Y += 1f;
                    lastDirection   = 1;
                }
                else
                {
                    lastPosition.X += 1f;
                    m++;
                    lastDirection = 2;
                }
                lake.addPoint(lastPosition);
            }
            int rightWidth = lakeAreaHeight - 4 - (int)(lastPosition.Y - (float)room.Y);

            lastPosition.Y += 1f;
            lastDirection   = 2;
            lake.addPoint(lastPosition);
            int l = 0;

            while (l < rightWidth)
            {
                int whichWayToGo2 = mineRandom.Next(3);
                if ((whichWayToGo2 == 0 && lastPosition.X < (float)room.Right && lastDirection != 1) || (lastDirection == 2 && lastPosition.X <= (float)(lakeXPosition + lakeAreaWidth / 2 + 1)))
                {
                    lastPosition.X += 1f;
                    lastDirection   = 0;
                }
                else if ((whichWayToGo2 == 1 && lastPosition.X > (float)(lakeXPosition + lakeAreaWidth / 2 + 1) && lastDirection != 0) || (lastDirection == 2 && lastPosition.X >= (float)room.Right))
                {
                    lastPosition.X -= 1f;
                    lastDirection   = 1;
                }
                else
                {
                    lastPosition.Y += 1f;
                    l++;
                    lastDirection = 2;
                }
                lake.addPoint(lastPosition);
            }
            int bottomWidth = (int)lastPosition.X - (int)lake.Lines[0].Start.X + lakeAreaWidth / 4;

            lastPosition.X -= 1f;
            lastDirection   = 2;
            lake.addPoint(lastPosition);
            int k = 0;

            while (k < bottomWidth)
            {
                int whichWayToGo3 = mineRandom.Next(3);
                if ((whichWayToGo3 == 0 && lastPosition.Y > (float)(lakeYPosition + lakeAreaHeight / 2) && lastDirection != 1 && !lake.containsPoint(new Vector2(lastPosition.X, lastPosition.Y - 1f))) || (lastDirection == 2 && lastPosition.Y >= (float)room.Bottom))
                {
                    lastPosition.Y -= 1f;
                    lastDirection   = 0;
                }
                else if ((whichWayToGo3 == 1 && lastPosition.Y < (float)room.Bottom && lastDirection != 0) || (lastDirection == 2 && lastPosition.Y <= (float)(lakeYPosition + lakeAreaHeight / 2)))
                {
                    lastPosition.Y += 1f;
                    lastDirection   = 1;
                }
                else
                {
                    lastPosition.X -= 1f;
                    k++;
                    lastDirection = 2;
                }
                lake.addPoint(lastPosition);
            }
            int leftWidth = (int)lastPosition.Y - (int)lake.Lines[0].Start.Y - 1;

            lastPosition.Y -= 1f;
            lastDirection   = 2;
            lake.addPoint(lastPosition);
            int j = 0;

            while (j < leftWidth)
            {
                int whichWayToGo4 = mineRandom.Next(3);
                if ((whichWayToGo4 == 0 && lastPosition.X < (float)room.Center.X && !lake.containsPoint(new Vector2(lastPosition.X + 1f, lastPosition.Y)) && !lake.containsPoint(new Vector2(lastPosition.X, lastPosition.Y - 1f))) || (lastDirection == 2 && lastPosition.X <= (float)room.X))
                {
                    lastPosition.X += 1f;
                    lastDirection   = 0;
                }
                else if ((whichWayToGo4 == 1 && lastPosition.X > (float)room.X && lastDirection != 0) || (lastDirection == 2 && lastPosition.X >= (float)room.Center.X))
                {
                    lastPosition.X -= 1f;
                    lastDirection   = 1;
                }
                else
                {
                    lastPosition.Y -= 1f;
                    j++;
                    lastDirection = 2;
                }
                lake.addPoint(lastPosition);
            }
            if (lastPosition.X < (float)(int)lake.Lines[0].Start.X)
            {
                int leftover = (int)lake.Lines[0].Start.X + 1 - (int)lastPosition.X - 1;
                for (int i = 0; i < leftover; i++)
                {
                    lastPosition.X += 1f;
                    lake.addPoint(lastPosition);
                }
            }
            return(lake);
        }
Пример #3
0
        public static Polygon getGentlerBorderForLakes(Rectangle room, Random mineRandom, Rectangle smoothZone)
        {
            int lakeAreaWidth  = room.Width - 2;
            int lakeAreaHeight = room.Height - 2;
            int lakeXPosition  = room.X + 1;
            int lakeYPosition  = room.Y + 1;

            new Rectangle(lakeXPosition, lakeYPosition, lakeAreaWidth, lakeAreaHeight);
            Polygon lake         = new Polygon();
            Vector2 lastPosition = new Vector2(mineRandom.Next(lakeXPosition + 5, lakeXPosition + 8), mineRandom.Next(lakeYPosition + 5, lakeYPosition + 8));

            lake.Lines.Add(new Line(lastPosition, new Vector2(lastPosition.X + 1f, lastPosition.Y)));
            lastPosition.X += 1f;
            int        topWidth      = lakeAreaWidth - 12;
            List <int> lastDirection = new List <int>
            {
                2,
                2,
                2
            };
            int m = 0;

            while (m < topWidth)
            {
                int whichWayToGo = mineRandom.Next(3);
                if (whichWayToGo == 0 && lastPosition.Y > (float)lakeYPosition && !lastDirection.Contains(1) && !smoothZone.Contains((int)lastPosition.X, (int)lastPosition.Y))
                {
                    lastPosition.Y -= 1f;
                    lastDirection.Add(0);
                }
                else if (whichWayToGo == 1 && lastPosition.Y < (float)(lakeYPosition + lakeAreaHeight / 2) && !lastDirection.Contains(0) && !smoothZone.Contains((int)lastPosition.X, (int)lastPosition.Y))
                {
                    lastPosition.Y += 1f;
                    lastDirection.Add(1);
                }
                else
                {
                    lastPosition.X += 1f;
                    m++;
                    lastDirection.Add(2);
                }
                lastDirection.RemoveAt(0);
                lake.addPoint(lastPosition);
            }
            int rightWidth = lakeAreaHeight - 4 - (int)(lastPosition.Y - (float)room.Y);

            lastPosition.Y += 1f;
            lastDirection   = new List <int>
            {
                2,
                2,
                2
            };
            lake.addPoint(lastPosition);
            int l = 0;

            while (l < rightWidth)
            {
                int whichWayToGo2 = mineRandom.Next(3);
                if (whichWayToGo2 == 0 && lastPosition.X < (float)(lakeXPosition + lakeAreaWidth) && !lastDirection.Contains(1) && !smoothZone.Contains((int)lastPosition.X, (int)lastPosition.Y))
                {
                    lastPosition.X += 1f;
                    lastDirection.Add(0);
                }
                else if (whichWayToGo2 == 1 && lastPosition.X > (float)(lakeXPosition + lakeAreaWidth / 2 + 1) && !lastDirection.Contains(0) && !smoothZone.Contains((int)lastPosition.X, (int)lastPosition.Y))
                {
                    lastPosition.X -= 1f;
                    lastDirection.Add(1);
                }
                else
                {
                    lastPosition.Y += 1f;
                    l++;
                    lastDirection.Add(2);
                }
                lastDirection.RemoveAt(0);
                lake.addPoint(lastPosition);
            }
            int bottomWidth = (int)lastPosition.X - (int)lake.Lines[0].Start.X + 1;

            lastPosition.X -= 1f;
            lastDirection   = new List <int>
            {
                2,
                2,
                2
            };
            lake.addPoint(lastPosition);
            int k = 0;

            while (k < bottomWidth)
            {
                int whichWayToGo3 = mineRandom.Next(3);
                if (whichWayToGo3 == 0 && lastPosition.Y > (float)(lakeYPosition + lakeAreaHeight / 2) && !lastDirection.Contains(1) && !lake.containsPoint(new Vector2(lastPosition.X, lastPosition.Y - 1f)) && !smoothZone.Contains((int)lastPosition.X, (int)lastPosition.Y))
                {
                    lastPosition.Y -= 1f;
                    lastDirection.Add(0);
                }
                else if (whichWayToGo3 == 1 && lastPosition.Y < (float)(lakeYPosition + lakeAreaHeight) && !lastDirection.Contains(0) && !smoothZone.Contains((int)lastPosition.X, (int)lastPosition.Y))
                {
                    lastPosition.Y += 1f;
                    lastDirection.Add(1);
                }
                else
                {
                    lastPosition.X -= 1f;
                    k++;
                    lastDirection.Add(2);
                }
                lastDirection.RemoveAt(0);
                lake.addPoint(lastPosition);
            }
            int leftWidth = (int)lastPosition.Y - (int)lake.Lines[0].Start.Y - 1;

            lastPosition.Y -= 1f;
            lastDirection   = new List <int>
            {
                2,
                2,
                2
            };
            lake.addPoint(lastPosition);
            int j = 0;

            while (j < leftWidth)
            {
                int whichWayToGo4 = mineRandom.Next(3);
                if (whichWayToGo4 == 0 && lastPosition.X < (float)(int)lake.Lines[0].Start.X && !lastDirection.Contains(1) && !lake.containsPoint(new Vector2(lastPosition.X + 1f, lastPosition.Y)) && !lake.containsPoint(new Vector2(lastPosition.X, lastPosition.Y - 1f)) && !smoothZone.Contains((int)lastPosition.X, (int)lastPosition.Y))
                {
                    lastPosition.X += 1f;
                    lastDirection.Add(0);
                }
                else if (whichWayToGo4 == 1 && lastPosition.X > (float)(lakeXPosition + 1) && !lastDirection.Contains(0) && !smoothZone.Contains((int)lastPosition.X, (int)lastPosition.Y))
                {
                    lastPosition.X -= 1f;
                    lastDirection.Add(1);
                }
                else
                {
                    lastPosition.Y -= 1f;
                    j++;
                    lastDirection.Add(2);
                }
                lastDirection.RemoveAt(0);
                lake.addPoint(lastPosition);
            }
            if (lastPosition.X < (float)(int)lake.Lines[0].Start.X)
            {
                int leftover = (int)lake.Lines[0].Start.X + 1 - (int)lastPosition.X - 1;
                for (int i = 0; i < leftover; i++)
                {
                    lastPosition.X += 1f;
                    lake.addPoint(lastPosition);
                }
            }
            return(lake);
        }
Пример #4
0
 // Token: 0x060002CE RID: 718 RVA: 0x00039744 File Offset: 0x00037944
 public static Polygon getEdgeBorder(Rectangle room, Random mineRandom, List <Rectangle> smoothZone)
 {
     return(Polygon.getEdgeBorder(room, mineRandom, smoothZone, (room.Width - 2) / 2, (room.Height - 2) / 2));
 }
Пример #5
0
 // Token: 0x060002CD RID: 717 RVA: 0x00039722 File Offset: 0x00037922
 public static Polygon getEdgeBorder(Rectangle room, Random mineRandom)
 {
     return(Polygon.getEdgeBorder(room, mineRandom, new List <Rectangle>(), (room.Width - 2) / 2, (room.Height - 2) / 2));
 }
Пример #6
0
 // Token: 0x060002CC RID: 716 RVA: 0x00039714 File Offset: 0x00037914
 public static Polygon getGentlerBorderForLakes(Rectangle room, Random mineRandom)
 {
     return(Polygon.getGentlerBorderForLakes(room, mineRandom, Rectangle.Empty));
 }