Exemplo n.º 1
0
    // 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);
    }
Exemplo n.º 2
0
    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())));
    }
Exemplo n.º 3
0
    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);
    }
Exemplo n.º 4
0
    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);
    }
Exemplo n.º 5
0
    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);
    }
Exemplo n.º 6
0
    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);
        }
    }
Exemplo n.º 7
0
    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);
        }
    }
Exemplo n.º 8
0
 public IEnumerable <RoomDirection> GetValidDirectionsFromRoom(RoomCoordinates coordinates)
 {
     return(GetValidDirectionsFromRoom(coordinates.X, coordinates.Y));
 }
Exemplo n.º 9
0
 public void AddRoom(RoomCoordinates coordinates, Room room)
 {
     AddRoom(coordinates.X, coordinates.Y, room);
 }
Exemplo n.º 10
0
 public bool IsDeadEnd(RoomCoordinates coordinates)
 {
     return(IsDeadEnd(coordinates.X, coordinates.Y));
 }
Exemplo n.º 11
0
 public bool CanRoomBeAdded(RoomCoordinates coordinates)
 {
     return(CanRoomBeAdded(coordinates.X, coordinates.Y));
 }
Exemplo n.º 12
0
 public bool ContainsRoom(RoomCoordinates coordinates)
 {
     return(ContainsRoom(coordinates.X, coordinates.Y));
 }
Exemplo n.º 13
0
    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);
    }