// Creates the "graph" of the level and the room coordinates private int CreateBranch(Room previousRoom, RoomCoordinates coordinates, int numberOfRoomsCreated) { var branchLength = Random.Range(1, 4); var previousBranchRoom = previousRoom; var branchCoordinates = coordinates; while (branchLength > 0) { try { RoomDirection direction = DetermineNextRoomLocation(branchCoordinates); branchCoordinates = DetermineNewCoordinates(direction, branchCoordinates); if (_floorGrid.CanRoomBeAdded(branchCoordinates.X, branchCoordinates.Y)) { previousBranchRoom = AddNewRoom(previousBranchRoom, direction, branchCoordinates); numberOfRoomsCreated++; } } catch (Exception) { Debug.Log("Branching failed :("); break; } branchLength--; } return(numberOfRoomsCreated); }
private RoomDirection DetermineNextRoomLocation(RoomCoordinates coordinates) { var validDirections = _floorGrid.GetValidDirectionsFromRoom(coordinates.X, coordinates.Y).ToList(); if (!validDirections.Any()) { throw new Exception("Created dead-end :("); } return(validDirections.ElementAt(Random.Range(0, validDirections.Count()))); }
private void CreateBossRoom(Room previousRoom, RoomCoordinates coordinates, RoomType roomType) { //Debug.Log("Room before boss: "+ previousRoom.name); var validDirections = _floorGrid.GetValidDirectionsFromRoom(coordinates.X, coordinates.Y).ToList(); if (!validDirections.Any()) { throw new Exception("Failed to create boss room."); } var direction = validDirections.ElementAt(Random.Range(0, validDirections.Count())); AddNewRoom(previousRoom, direction, DetermineNewCoordinates(direction, coordinates), roomType); }
private Room AddNewRoom(Room previousRoom, RoomDirection direction, RoomCoordinates coordinates, RoomType roomType = RoomType.NormalRoom) { var newRoom = CreateRoom(previousRoom, direction, roomType); if (previousRoom != null) { previousRoom.SetAdjacentRoom(newRoom, direction); newRoom.SetAdjacentRoom(previousRoom, GetOppositeRoomDirection(direction)); } _floorGrid.AddRoom(coordinates.X, coordinates.Y, newRoom); previousRoom = newRoom; return(previousRoom); }
private Room CreateFirstRoom(RoomCoordinates coordinates) { Room previousRoom; if (FirstRoom != null) { previousRoom = (Room)Instantiate(FirstRoom); _floorGrid.AddRoom(coordinates.X, coordinates.Y, previousRoom); } else { previousRoom = (Room)Instantiate(RoomPrefabs.First()); _floorGrid.AddRoom(coordinates.X, coordinates.Y, previousRoom); } return(previousRoom); }
private RoomCoordinates DetermineNewCoordinates(RoomDirection direction, RoomCoordinates previousCoordinates) { switch (direction) { case RoomDirection.North: return(new RoomCoordinates(previousCoordinates.X, previousCoordinates.Y + 1)); case RoomDirection.East: return(new RoomCoordinates(previousCoordinates.X + 1, previousCoordinates.Y)); case RoomDirection.South: return(new RoomCoordinates(previousCoordinates.X, previousCoordinates.Y - 1)); case RoomDirection.West: return(new RoomCoordinates(previousCoordinates.X - 1, previousCoordinates.Y)); default: return(previousCoordinates); } }
private void GenerateFloorLayout() { var coordinates = new RoomCoordinates(Random.Range(1, 4), Random.Range(1, 4)); var firstRoom = CreateFirstRoom(coordinates); //No rooms were created yet int numberOfRoomsCreated = CreateBranch(firstRoom, coordinates, 0); /* * if (Random.Range(0.0f, 1.0f) <= _branchingProbability) { * numberOfRoomsCreated = CreateBranch(firstRoom, coordinates, numberOfRoomsCreated); * } */ var previousRoom = firstRoom; if (level == maxLevels) { numberOfRooms += 1; } while (numberOfRoomsCreated < numberOfRooms - 1) { RoomDirection direction; try { direction = DetermineNextRoomLocation(coordinates); } catch (Exception ex) { previousRoom = _floorGrid.Rooms.FirstOrDefault(r => _floorGrid.GetValidDirectionsFromRoom(r).Any()); if (previousRoom == null) { throw new Exception("Everything is ruined", ex); } direction = DetermineNextRoomLocation(_floorGrid.GetCoordinatesForRoom(previousRoom)); coordinates = _floorGrid.GetCoordinatesForRoom(previousRoom); } coordinates = DetermineNewCoordinates(direction, coordinates); if (!_floorGrid.IsDeadEnd(coordinates.X, coordinates.Y)) { previousRoom = AddNewRoom(previousRoom, direction, coordinates); numberOfRoomsCreated++; } if (numberOfRoomsCreated < numberOfRooms - 1 && Random.Range(0.0f, 1.0f) <= _branchingProbability) { numberOfRoomsCreated = CreateBranch(previousRoom, coordinates, numberOfRoomsCreated); } } if (!_floorGrid.GetValidDirectionsFromRoom(previousRoom).Any()) { var validRooms = _floorGrid.Rooms.Where( r => r != firstRoom && _floorGrid.GetValidDirectionsFromRoom(r).Any()).ToList(); previousRoom = validRooms.ElementAt(Random.Range(0, validRooms.Count)); coordinates = _floorGrid.GetCoordinatesForRoom(previousRoom); } // Boss room should not appear at the last level if (level != maxLevels) { CreateBossRoom(previousRoom, coordinates, RoomType.BossRoom); } else { CreateBossRoom(previousRoom, coordinates, RoomType.AngelRoom); CreateBossRoom(previousRoom, coordinates, RoomType.DevilRoom); } if (!_floorGrid.GetValidDirectionsFromRoom(previousRoom).Any()) { var validRooms = _floorGrid.Rooms.Where( r => r._roomType == RoomType.NormalRoom && _floorGrid.GetValidDirectionsFromRoom(r).Any()).ToList(); previousRoom = validRooms.ElementAt(Random.Range(0, validRooms.Count)); coordinates = _floorGrid.GetCoordinatesForRoom(previousRoom); } }
public IEnumerable <RoomDirection> GetValidDirectionsFromRoom(RoomCoordinates coordinates) { return(GetValidDirectionsFromRoom(coordinates.X, coordinates.Y)); }
public void AddRoom(RoomCoordinates coordinates, Room room) { AddRoom(coordinates.X, coordinates.Y, room); }
public bool IsDeadEnd(RoomCoordinates coordinates) { return(IsDeadEnd(coordinates.X, coordinates.Y)); }
public bool CanRoomBeAdded(RoomCoordinates coordinates) { return(CanRoomBeAdded(coordinates.X, coordinates.Y)); }
public bool ContainsRoom(RoomCoordinates coordinates) { return(ContainsRoom(coordinates.X, coordinates.Y)); }
private void GenerateFloorLayout() { var coordinates = new RoomCoordinates(Random.Range(1, 4), Random.Range(1, 4)); var firstRoom = CreateFirstRoom(coordinates); //Create branch for the first room int numberOfRoomsCreated = CreateBranch(firstRoom, coordinates, 0); if (Random.Range(0.0f, 1.0f) <= BranchingProbability) { Debug.Log("Branching!"); numberOfRoomsCreated = CreateBranch(firstRoom, coordinates, numberOfRoomsCreated); } var previousRoom = firstRoom; while (numberOfRoomsCreated < _numberOfRooms - 1) { RoomDirection direction; try { direction = DetermineNextRoomLocation(coordinates); } catch (Exception ex) { previousRoom = _floorGrid.Rooms.FirstOrDefault(r => _floorGrid.GetValidDirectionsFromRoom(r).Any()); if (previousRoom == null) { throw new Exception("Everything is ruined", ex); } direction = DetermineNextRoomLocation(_floorGrid.GetCoordinatesForRoom(previousRoom)); coordinates = _floorGrid.GetCoordinatesForRoom(previousRoom); } coordinates = DetermineNewCoordinates(direction, coordinates); if (!_floorGrid.IsDeadEnd(coordinates.X, coordinates.Y)) { previousRoom = AddNewRoom(previousRoom, direction, coordinates); numberOfRoomsCreated++; } if (numberOfRoomsCreated < _numberOfRooms - 1 && Random.Range(0.0f, 1.0f) <= BranchingProbability) { Debug.Log("Branching!"); numberOfRoomsCreated = CreateBranch(previousRoom, coordinates, numberOfRoomsCreated); } //if (Random.Range(0.0f, 1.0f) >= BranchingProbability*BranchingProbability) //{ // Debug.Log("Branching again!"); // numberOfRoomsCreated = CreateBranch(previousRoom, coordinates, numberOfRoomsCreated); //} } if (!_floorGrid.GetValidDirectionsFromRoom(previousRoom).Any()) { var validRooms = _floorGrid.Rooms.Where( r => r != firstRoom && _floorGrid.GetValidDirectionsFromRoom(r).Any()).ToList(); previousRoom = validRooms.ElementAt(Random.Range(0, validRooms.Count)); coordinates = _floorGrid.GetCoordinatesForRoom(previousRoom); } CreateBossRoom(previousRoom, coordinates); if (!_floorGrid.GetValidDirectionsFromRoom(previousRoom).Any()) { var validRooms = _floorGrid.Rooms.Where( r => r.RoomType == RoomType.NormalRoom && _floorGrid.GetValidDirectionsFromRoom(r).Any()).ToList(); previousRoom = validRooms.ElementAt(Random.Range(0, validRooms.Count)); coordinates = _floorGrid.GetCoordinatesForRoom(previousRoom); } var dir = _floorGrid.GetValidDirectionsFromRoom(coordinates).First(); AddNewRoom(previousRoom, dir, DetermineNewCoordinates(dir, coordinates), RoomType.TreasureRoom); }