示例#1
0
        NodeConnection[] GetConnectionCandidates(BSPNodeObject[] leftRooms, BSPNodeObject[] rightRooms)
        {
            var connections = new List <NodeConnection>();

            foreach (var leftRoom in leftRooms)
            {
                foreach (var rightRoom in rightRooms)
                {
                    // Connect left and right together
                    var intersection    = Rectangle.Intersect(leftRoom.bounds, rightRoom.bounds);
                    var minIntersection = bspConfig.roomPadding * 2;
                    if (intersection.Size.x > minIntersection || intersection.Size.z > minIntersection)
                    {
                        var connection = new NodeConnection(leftRoom, rightRoom, bspConfig.roomPadding);
                        connections.Add(connection);
                    }
                }
            }

            return(connections.ToArray());
        }
示例#2
0
        NodeConnection[] ConnectPartitions(BSPNodeObject leftPartition, BSPNodeObject rightPartition, bool horizontalSplit)
        {
            var connections = new List <NodeConnection>();

            if (leftPartition.discarded || rightPartition.discarded)
            {
                return(connections.ToArray());
            }

            var leftRooms  = new List <BSPNodeObject>();
            var rightRooms = new List <BSPNodeObject>();

            if (horizontalSplit)
            {
                FindBoundaryEdgeRooms(leftPartition, BSPNodeDirection.Right, leftRooms);
                FindBoundaryEdgeRooms(rightPartition, BSPNodeDirection.Left, rightRooms);
            }
            else               // Vertical split
            {
                // Left = bottom partition
                // Right = top partition
                FindBoundaryEdgeRooms(leftPartition, BSPNodeDirection.Top, leftRooms);
                FindBoundaryEdgeRooms(rightPartition, BSPNodeDirection.Bottom, rightRooms);
            }

            // Connect the two rooms together
            if (leftRooms.Count == 0 || rightRooms.Count == 0)
            {
                return(connections.ToArray());
            }

            Shuffle(leftRooms);
            Shuffle(rightRooms);

            bool roomsConnected = false;

            foreach (var leftRoom in leftRooms)
            {
                // First check if any of the right rooms are connected
                foreach (var rightRoom in rightRooms)
                {
                    if (leftRoom.connectedRooms.Contains(rightRoom))
                    {
                        roomsConnected = true;
                        break;
                    }
                }

                foreach (var rightRoom in rightRooms)
                {
                    if (leftRoom.connectedRooms.Contains(rightRoom))
                    {
                        // Already connected
                        continue;
                    }

                    bool shouldConnectRooms = true;
                    if (roomsConnected)
                    {
                        // rooms are already connected along this edge.  Check if can loop
                        shouldConnectRooms = random.NextFloat() < bspConfig.loopingProbability;
                    }

                    if (shouldConnectRooms)
                    {
                        // Connect left and right together
                        var intersection    = Rectangle.Intersect(leftRoom.bounds, rightRoom.bounds);
                        var minIntersection = bspConfig.roomPadding * 2;
                        if (intersection.Size.x > minIntersection || intersection.Size.z > minIntersection)
                        {
                            // These two rooms can connect
                            leftRoom.connectedRooms.Add(rightRoom);
                            rightRoom.connectedRooms.Add(leftRoom);
                            roomsConnected = true;

                            var connection = new NodeConnection(leftRoom, rightRoom, bspConfig.roomPadding);
                            connections.Add(connection);
                        }
                    }
                }
            }

            return(connections.ToArray());
        }