Пример #1
0
    private UnitBounds GenerateSymetricalRoom(UnitBounds room)
    {
        int        x = room.center.x;
        int        y = room.center.y;
        Vector2Int mirroredPosition = new Vector2Int(-x, y);

        switch (parameters.axisOfSymetry)
        {
        case TileMappingParameters.axisOfSymetry.X:
            mirroredPosition = new Vector2Int(-x, y);
            break;

        case TileMappingParameters.axisOfSymetry.Y:
            mirroredPosition = new Vector2Int(x, -y);
            break;

        case TileMappingParameters.axisOfSymetry.Diagonal1:
            mirroredPosition = new Vector2Int(-x, -y);
            break;

        case TileMappingParameters.axisOfSymetry.Diagonal2:
            mirroredPosition = new Vector2Int(y, x);
            break;
        }

        return(CreateRoom(mirroredPosition, room.size));
    }
Пример #2
0
    private BoundsInt UnitBoundsToTileBounds(UnitBounds unitBounds)
    {
        Vector3Int position = UnitToTile(unitBounds.position);
        Vector3Int size     = UnitToTile(unitBounds.size);

        return(new BoundsInt(position, size));
    }
Пример #3
0
 private void SetOccupied(UnitBounds bounds, bool occupied)
 {
     for (int x = bounds.position.x; x < bounds.position.x + bounds.size.x; x++)
     {
         for (int y = bounds.position.y; y < bounds.position.y + bounds.size.y; y++)
         {
             Vector2Int unit = new Vector2Int(x, y);
             _units[unit] = occupied;
         }
     }
 }
Пример #4
0
    private UnitBounds CreateRoom(Vector2Int position, Vector2Int size)
    {
        float      chance = Random.Range(0.0f, 100.0f);
        UnitBounds room   = new UnitBounds(position, size);

        if (chance < parameters.focalRoomChance)
        {
            room.size = room.size * parameters.focalRoomScale;
        }
        SetOccupied(room, true);
        _rooms.Add(room);
        FillUnitBounds(room);
        return(room);
    }
Пример #5
0
    private void ConnectRandomRooms()
    {
        List <UnitBounds> _tempRooms = _rooms;
        int addedConnections         = (int)Mathf.Floor(parameters.additionalConnections * _rooms.Count);

        for (int i = 0; i < addedConnections - 1; i++)
        {
            int        randomIndexA = Random.Range(0, _tempRooms.Count);
            UnitBounds roomA        = _rooms[randomIndexA];
            _tempRooms.Remove(_rooms[randomIndexA]);
            int        randomIndexB = Random.Range(0, _tempRooms.Count);
            UnitBounds roomB        = _rooms[randomIndexB];
            ConnectRooms(roomA, roomB);
        }
    }
Пример #6
0
    private void Generate()
    {
        _tilemap.ClearAllTiles();
        _units.Clear();

        UnitBounds centralRoom = CreateCentralRoom();

        _roomCount    = 1;
        _roomQuantity = Random.Range(parameters.roomQuantityMin, parameters.roomQuantityMax);

        BranchRecursively(centralRoom);
        if (parameters.allowAdditionalConnections)
        {
            ConnectRandomRooms();
        }
        AlignCamera();
    }
Пример #7
0
    private UnitBounds BranchRoom(UnitBounds room, int direction)
    {
        Vector2Int size         = new Vector2Int(Random.Range(parameters.roomSizeMin.x, parameters.roomSizeMax.x), Random.Range(parameters.roomSizeMin.y, parameters.roomSizeMax.y));
        Vector2Int position     = room.position;
        Vector2Int centerOffset = size / 2;

        int distance = Random.Range(parameters.roomDistanceMin, parameters.roomDistanceMax);
        int offset   = Random.Range(parameters.roomOffsetMin, parameters.roomOffsetMax);

        switch (direction)
        {
        case 0:     // up
            position.y += room.size.y + distance;
            position.x  = room.center.x + offset - centerOffset.x;
            break;

        case 1:     // down
            position.y -= size.y + distance;
            position.x  = room.center.x + offset - centerOffset.x;
            break;

        case 2:     // right
            position.x += room.size.x + distance;
            position.y  = room.center.y + offset - centerOffset.y;
            break;

        case 3:     // left
            position.x -= size.x + distance;
            position.y  = room.center.y + offset - centerOffset.y;
            break;
        }

        UnitBounds branch = CreateRoom(position, size);

        ConnectRooms(room, branch);
        if (parameters.symetricalBranching)
        {
            UnitBounds SymetricalBranch = GenerateSymetricalRoom(branch);
            ConnectRooms(room, SymetricalBranch);
        }
        return(branch);
    }
Пример #8
0
    private void ConnectRooms(UnitBounds roomA, UnitBounds roomB)
    {
        Vector2Int centerA = roomA.center;
        Vector2Int centerB = roomB.center;

        int centering = parameters.corridorWidth / 2;

        int xMin      = Mathf.Min(centerA.x, centerB.x) - centering;
        int xMax      = Mathf.Max(centerA.x, centerB.x) + centering;
        int xDistance = xMax - xMin;
        int xStart    = centerB.x - centering;

        int yMin      = Mathf.Min(centerA.y, centerB.y) - centering;
        int yMax      = Mathf.Max(centerA.y, centerB.y) + centering;
        int yDistance = yMax - yMin;
        int yStart    = centerA.y - centering;

        UnitBounds corridorHorizontal = new UnitBounds(xMin, yStart, xDistance, parameters.corridorWidth);
        UnitBounds corridorVertical   = new UnitBounds(xStart, yMin, parameters.corridorWidth, yDistance);

        FillUnitBounds(corridorHorizontal);
        FillUnitBounds(corridorVertical);
    }
Пример #9
0
    private void BranchRecursively(UnitBounds room)
    {
        UnitBounds branch;
        UnitBounds randomRoom = _rooms[Random.Range(0, _rooms.Count)];

        if (_roomCount++ >= _roomQuantity)
        {
            return;
        }

        int   direction = Random.Range(0, 4);
        float chance    = Random.Range(0.0f, 100.0f);

        if (chance > parameters.centralBranchChance)
        {
            branch = BranchRoom(room, direction);
        }

        else
        {
            branch = BranchRoom(_rooms[0], direction);
        }
        BranchRecursively(branch);
    }
Пример #10
0
    private void FillUnitBounds(UnitBounds bounds)
    {
        BoundsInt tileBounds = UnitBoundsToTileBounds(bounds);

        FillTileBounds(tileBounds);
    }