Esempio n. 1
0
        private RoomTemplate[,] BuildRoomSequence(RoomChain roomChainComponent, int horizontalRoomsToFill, int verticalRoomsToFill)
        {
            RoomTemplate[,] filledGrid = new RoomTemplate[horizontalRoomsToFill, verticalRoomsToFill];

            int xStart = 0;
            int yStart = 0;

            if (!pickStartPositionFromList)
            {
                xStart = Random.Range(0, horizontalRoomsToFill);
                yStart = Random.Range(0, verticalRoomsToFill);
            }
            else
            {
                GridPosition randomListPosition = startPositions[Random.Range(0, startPositions.Length)];
                xStart = randomListPosition.x;
                yStart = randomListPosition.y;
            }
            RoomTileSpace firstRoomTileSpace   = new RoomTileSpace(xStart, yStart, startRoomList);
            RoomTileSpace currentRoomTileSpace = SelectNextRoomInSequence(roomChainComponent, horizontalRoomsToFill, verticalRoomsToFill, filledGrid, firstRoomTileSpace);
            RoomTileSpace endTileSpace         = currentRoomTileSpace;

            for (int i = 0; i <= maximumGeneratedRooms; i++)
            {
                currentRoomTileSpace = SelectNextRoomInSequence(roomChainComponent, horizontalRoomsToFill, verticalRoomsToFill, filledGrid, currentRoomTileSpace);
                if (currentRoomTileSpace != null)
                {
                    endTileSpace = currentRoomTileSpace;
                    filledGrid[currentRoomTileSpace.x, currentRoomTileSpace.y] = currentRoomTileSpace.roomTemplate;
                }
                else
                {
                    if (placeCustomEndRoom)
                    {
                        filledGrid[endTileSpace.x, endTileSpace.y] = endRoomList.RandomRoom();
                        endroomDoorX = endTileSpace.x;
                        endroomDoorY = endTileSpace.y;
                        Debug.Log("room: " + endroomDoorX + " " + endroomDoorY);
                    }
                    break;
                }
            }
            if (roomChainComponent.roomsCreated >= minimumGeneratedRooms)
            {
                return(filledGrid);
            }
            else
            {
                return(null);
            }
        }
Esempio n. 2
0
        private RoomTileSpace SelectNextRoomInSequence(RoomChain roomChainComponent, int horizontalRoomsToFill, int verticalRoomsToFill, RoomTemplate[,] roomTemplateGrid, RoomTileSpace currentSpace)
        {
            currentSpace.SelectRoomTemplateForSpace();
            roomTemplateGrid[currentSpace.x, currentSpace.y] = currentSpace.roomTemplate;
            List <Direction> possibleDirections = new List <Direction>();

            if (currentSpace.roomTemplate.opensToNorth)
            {
                possibleDirections.Add(Direction.North);
            }
            if (currentSpace.roomTemplate.opensToEast)
            {
                possibleDirections.Add(Direction.East);
            }
            if (currentSpace.roomTemplate.opensToSouth)
            {
                possibleDirections.Add(Direction.South);
            }
            if (currentSpace.roomTemplate.opensToWest)
            {
                possibleDirections.Add(Direction.West);
            }
            bool foundNextDirection = false;

            while (!foundNextDirection)
            {
                if (possibleDirections.Count <= 0)
                {
                    return(null);
                }
                else
                {
                    Direction nextDirection = possibleDirections[Random.Range(0, possibleDirections.Count)];
                    possibleDirections.Remove(nextDirection);

                    switch (nextDirection)
                    {
                    case Direction.North:
                        if (TestIfGridIndexIsValid(currentSpace.x, currentSpace.y + 1, horizontalRoomsToFill, verticalRoomsToFill))
                        {
                            int x = currentSpace.x;
                            int y = currentSpace.y + 1;

                            if (roomTemplateGrid[x, y] == null)
                            {
                                roomChainComponent.roomsCreated++;
                                foundNextDirection = true;
                                return(new RoomTileSpace(x, y, hasSouthExit));
                            }
                        }
                        break;

                    case Direction.East:

                        if (TestIfGridIndexIsValid(currentSpace.x + 1, currentSpace.y, horizontalRoomsToFill, verticalRoomsToFill))
                        {
                            int x = currentSpace.x + 1;
                            int y = currentSpace.y;

                            if (roomTemplateGrid[x, y] == null)
                            {
                                roomChainComponent.roomsCreated++;
                                foundNextDirection = true;
                                return(new RoomTileSpace(x, y, hasWestExit));
                            }
                        }
                        break;

                    case Direction.South:
                        if (TestIfGridIndexIsValid(currentSpace.x, currentSpace.y - 1, horizontalRoomsToFill, verticalRoomsToFill))
                        {
                            int x = currentSpace.x;
                            int y = currentSpace.y - 1;

                            if (roomTemplateGrid[x, y] == null)
                            {
                                roomChainComponent.roomsCreated++;
                                foundNextDirection = true;
                                return(new RoomTileSpace(x, y, hasNorthExit));
                            }
                        }
                        break;

                    case Direction.West:
                        if (TestIfGridIndexIsValid(currentSpace.x - 1, currentSpace.y, horizontalRoomsToFill, verticalRoomsToFill))
                        {
                            int x = currentSpace.x - 1;
                            int y = currentSpace.y;

                            if (roomTemplateGrid[x, y] == null)
                            {
                                roomChainComponent.roomsCreated++;
                                foundNextDirection = true;
                                return(new RoomTileSpace(x, y, hasEastExit));
                            }
                        }
                        break;

                    case Direction.NoMove:
                        break;

                    default:
                        return(null);
                    }
                }
            }
            return(null);
        }