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); } }
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); }