Exemplo n.º 1
0
        Link?PlaceRoomTargetFixed(Room src, FixedRoom target, int connPt, int sep)
        {
            var targetDir = ((Direction)connPt).Reverse();

            var connPts = (Tuple <Direction, int>[])target.ConnectionPoints.Clone();

            _rand.Shuffle(connPts);
            Tuple <Direction, int> conn = null;

            foreach (var pt in connPts)
            {
                if (pt.Item1 == targetDir)
                {
                    conn = pt;
                    break;
                }
            }

            if (conn == null)
            {
                return(null);
            }

            int  x, y;
            Link?link = null;

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

                if (conn.Item1 == Direction.North)
                {
                    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);
                }

                link = new Link((Direction)connPt, target.Pos.X + conn.Item2);
                break;

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

                if (conn.Item1 == Direction.West)
                {
                    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);
                }

                link = new Link((Direction)connPt, target.Pos.Y + conn.Item2);
                break;
            }

            _collision.Add(target);
            return(link);
        }
Exemplo n.º 2
0
        Link?PlaceRoomFixed(FixedRoom src, FixedRoom target, int connPt, int sep)
        {
            var conn = src.ConnectionPoints[connPt];

            var targetDirection = conn.Item1.Reverse();
            var targetConns     = (Tuple <Direction, int>[])target.ConnectionPoints.Clone();

            _rand.Shuffle(targetConns);
            Tuple <Direction, int> targetConnPt = null;

            foreach (var targetConn in targetConns)
            {
                if (targetConn.Item1 == targetDirection)
                {
                    targetConnPt = targetConn;
                    break;
                }
            }

            if (targetConnPt == null)
            {
                return(null);
            }

            int  x, y;
            Link?link = null;

            switch (conn.Item1)
            {
            case Direction.North:
            case Direction.South:
                // North & South
                x = src.Pos.X + conn.Item2 - targetConnPt.Item2;

                if (conn.Item1 == 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);
                }

                link = new Link(conn.Item1, src.Pos.X + conn.Item2);
                break;

            case Direction.East:
            case Direction.West:
                // East & West
                y = src.Pos.Y + conn.Item2 - targetConnPt.Item2;

                if (conn.Item1 == 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);
                }

                link = new Link(conn.Item1, src.Pos.Y + conn.Item2);
                break;
            }

            _collision.Add(target);
            return(link);
        }
Exemplo n.º 3
0
        Link?PlaceRoomSourceFixed(FixedRoom src, Room target, int connPt, int sep)
        {
            var  conn = src.ConnectionPoints[connPt];
            int  x, y;
            Link?link = null;

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

                if (conn.Item1 == 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);
                }

                link = new Link(conn.Item1, src.Pos.X + conn.Item2);
                break;

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

                if (conn.Item1 == 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);
                }

                link = new Link(conn.Item1, src.Pos.Y + conn.Item2);
                break;
            }

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