Example #1
0
    void ConnectRooms(List <CARoom> allRooms)
    {
        List <CARoom> roomListA = allRooms;
        List <CARoom> roomListB = allRooms;

        foreach (CARoom room1 in roomListA)
        {
            if (!room1.checkMaxPassages())
            {
                continue;
            }
            List <CAConnection> connectionsList = new List <CAConnection>();
            foreach (CARoom room2 in roomListB)
            {
                if (room1.connectedRooms.Contains(room2))
                {
                    continue;
                }

                int          bestDistance;
                CAConnection connectionBetweenRooms = GetBestConnection(room1, room2, false, out bestDistance);
                if (connectionBetweenRooms != null)
                {
                    connectionsList.Add(connectionBetweenRooms);
                }
            }

            for (int i = room1.passages; i <= room1.maxPassages; i++)
            {
                if (connectionsList.Count == 0)
                {
                    break;
                }

                int          index      = pseudoRandom.Next(0, connectionsList.Count);
                CAConnection connection = connectionsList[index];

                if (connectionType == ConnectionType.straight)
                {
                    CreateStraightCorridor(connection.roomA, connection.roomB, connection.connectionTileA, connection.connectionTileB, false);
                }
                else
                {
                    CreateDirectCorridor(connection.roomA, connection.roomB, connection.connectionTileA, connection.connectionTileB, false);
                }

                connectionsList.Remove(connection);
            }
        }

        ConnectRoomsToMain(allRooms);
    }
Example #2
0
    private void ConnectRoomsToMain(List <CARoom> allRooms)
    {
        List <CARoom> roomListA = new List <CARoom>();
        List <CARoom> roomListB = new List <CARoom>();

        foreach (CARoom room in allRooms)
        {
            if (room.isAccessibleFromMainRoom)
            {
                roomListB.Add(room);
            }
            else
            {
                roomListA.Add(room);
            }
        }

        foreach (CARoom room1 in roomListA)
        {
            CAConnection connection   = null;
            int          bestDistance = -1;
            foreach (CARoom room2 in roomListB)
            {
                int          tmp;
                CAConnection connectionBetweenRooms = GetBestConnection(room1, room2, true, out tmp);

                if (connectionBetweenRooms != null)
                {
                    if (tmp < bestDistance || bestDistance == -1)
                    {
                        bestDistance = tmp;
                        connection   = connectionBetweenRooms;
                    }
                }
            }

            if (bestDistance != -1)
            {
                if (connectionType == ConnectionType.straight)
                {
                    CreateStraightCorridor(connection.roomA, connection.roomB, connection.connectionTileA, connection.connectionTileB, true);
                }
                else
                {
                    CreateDirectCorridor(connection.roomA, connection.roomB, connection.connectionTileA, connection.connectionTileB, true);
                }
            }
        }
    }
Example #3
0
    private CAConnection GetBestConnection(CARoom room1, CARoom room2, bool forceAccessibilityFromMainRoom, out int bestDistance)
    {
        List <CAConnection> connectionsBetweenRooms = new List <CAConnection>();

        bestDistance = -1;

        foreach (Tile c1 in room1.edgeTiles)
        {
            foreach (Tile c2 in room2.edgeTiles)
            {
                if (!forceAccessibilityFromMainRoom && (Math.Abs(c1.tileX - c2.tileX) > maxCorridorLengthX || Math.Abs(c1.tileY - c2.tileY) > maxCorridorLengthY))
                {
                    continue;
                }

                int distanceBetweenRooms = (int)(Mathf.Pow(c1.tileX - c2.tileX, 2) + Mathf.Pow(c1.tileY - c2.tileY, 2));

                if (bestDistance > distanceBetweenRooms || bestDistance == -1)
                {
                    bestDistance = distanceBetweenRooms;
                    connectionsBetweenRooms.Clear();
                    connectionsBetweenRooms.Add(new CAConnection(c1, c2, room1, room2, distanceBetweenRooms));
                }
                else if (bestDistance == distanceBetweenRooms)
                {
                    connectionsBetweenRooms.Add(new CAConnection(c1, c2, room1, room2, distanceBetweenRooms));
                }
            }
        }

        if (bestDistance != -1)
        {
            int          index      = pseudoRandom.Next(0, connectionsBetweenRooms.Count);
            CAConnection connection = connectionsBetweenRooms[index];
            return(connection);
        }

        return(null);
    }