Example #1
0
        Link?PlaceRoomFree(Room src, Room target, Direction connPt, int sep)
        {
            int  x, y;
            Link?link = null;

            switch (connPt)
            {
            case Direction.North:
            case Direction.South:
                // North & South
                int minX = src.Pos.X + _template.CorridorWidth - target.Width;
                int maxX = src.Pos.X + src.Width - _template.CorridorWidth;
                x = _rand.Next(minX, maxX + 1);

                if (connPt == Direction.South)
                {
                    y = src.Pos.Y + src.Height + sep;
                }
                else
                {
                    y = src.Pos.Y - sep - target.Height;
                }

                target.Pos = new Point(x, y);
                if (_collision.HitTest(target))
                {
                    return(null);
                }

                var linkX = new Range(src.Pos.X, src.Pos.X + src.Width).Intersection(
                    new Range(target.Pos.X, target.Pos.X + target.Width));
                link = new Link(connPt, new Range(linkX.Begin, linkX.End - _template.CorridorWidth).Random(_rand));
                break;

            case Direction.East:
            case Direction.West:
                // East & West
                int minY = src.Pos.Y + _template.CorridorWidth - target.Height;
                int maxY = src.Pos.Y + src.Height - _template.CorridorWidth;
                y = _rand.Next(minY, maxY + 1);

                if (connPt == Direction.East)
                {
                    x = src.Pos.X + src.Width + sep;
                }
                else
                {
                    x = src.Pos.X - sep - target.Width;
                }

                target.Pos = new Point(x, y);
                if (_collision.HitTest(target))
                {
                    return(null);
                }

                var linkY = new Range(src.Pos.Y, src.Pos.Y + src.Height).Intersection(
                    new Range(target.Pos.Y, target.Pos.Y + target.Height));
                link = new Link(connPt, new Range(linkY.Begin, linkY.End - _template.CorridorWidth).Random(_rand));
                break;
            }

            _collision.Add(target);
            return(link);
        }