public static void PackRoom(Room room, int floor, Dungeon building)
    {
        room.xSize = (int)Mathf.Sqrt(room.size);
        room.ySize = (int)(room.size / (float)room.xSize);
        int swapRoll = Random.Range(0, 2);

        if (swapRoll == 0)
        {
            var temp = room.xSize;
            room.xSize = room.ySize;
            room.ySize = temp;
        }
        for (int x = 0; x < building.maxDimensions - room.xSize; x++)
        {
            for (int y = 0; y < building.maxDimensions - room.ySize; y++)
            {
                if (LevelGenValidationUtils.RoomFits(room, floor, x, y, building.grid))
                {
                    room.x     = x;
                    room.y     = y;
                    room.floor = floor;
                    LevelGenGridUtils.FillRoom(room, floor, x, y, building.grid);
                    return;
                }
            }
        }
        building.maxDimensions = (int)(building.maxDimensions * 1.2);
        PackRoom(room, floor, building);
    }
示例#2
0
    private static bool AddStraightConnectingLine(Room room, Room room2, Dungeon building)
    {
        var  right   = LevelGenValidationUtils.IsStraightConnectingLineRight(room, room2, building.grid);
        var  bottom  = LevelGenValidationUtils.IsStraightConnectingLineBottom(room, room2, building.grid);
        var  top     = LevelGenValidationUtils.IsStraightConnectingLineTop(room, room2, building.grid);
        var  left    = LevelGenValidationUtils.IsStraightConnectingLineLeft(room, room2, building.grid);
        bool success = false;

        if (right)
        {
            success = DrawHorizontalCorridor(room.floor, room.x + room.xSize, room2.x, room, room2, building);
        }
        else if (left)
        {
            success = DrawHorizontalCorridor(room.floor, room2.x + room2.xSize, room.x, room, room2, building);
        }
        else if (bottom)
        {
            success = DrawVerticalCorridor(room.floor, room.y + room.ySize, room2.y, room, room2, building);
        }
        else if (top)
        {
            success = DrawVerticalCorridor(room.floor, room2.y + room2.ySize, room.y, room, room2, building);
        }
        return(success);
    }
示例#3
0
    private static void ConnectRoomToOtherRooms(int floor, Room room, Dungeon building, List <Room> floorRooms)
    {
        var room2 = LevelGenRoomUtils.FindClosestRoom(room, floorRooms);

        if (LevelGenValidationUtils.IsStraightConnectingLine(room, room2, building.grid))
        {
            AddStraightConnectingLine(room, room2, building);
        }
    }
示例#4
0
    private static void ConnectRoom(int floor, Room room, Dungeon building)
    {
        var corridors = LevelGenRoomUtils.FetchCorridorsForFloor(floor, building.rooms);
        var corridor  = LevelGenRoomUtils.FindClosestCorridor(room, corridors);

        if (LevelGenValidationUtils.IsStraightConnectingLine(room, corridor, building.grid))
        {
            AddStraightConnectingLine(room, corridor, building);
        }
    }
示例#5
0
    private static bool DrawVerticalCorridor(int floor, int start, int finish, Room room1, Room room2, Dungeon building)
    {
        bool reversed = false;

        if (start > finish)
        {
            var temp = start;
            start    = finish;
            finish   = temp;
            reversed = true;
        }
        int xMin = Mathf.Max(room1.x, room2.x);
        int xMax = Mathf.Min(room1.x + room1.xSize, room2.x + room2.xSize);
        int x    = Random.Range(xMin, xMax);

        if (!LevelGenValidationUtils.ValidVerticalCorridor(floor, start, finish, x, building.grid))
        {
            return(false);
        }
        int count = 0;

        while (!LevelGenValidationUtils.CanTraceVerticalLine(x, room1, room2, building.grid) && count < 10000)
        {
            x = Random.Range(xMin, xMax);
            count++;
        }
        if (count >= 10000)
        {
            return(false);
        }
        var corridor = new Corridor {
            x     = x,
            xSize = 1,
            y     = start,
            ySize = finish - start,
            floor = floor
        };

        corridor.connectedRooms.Add(room1);
        corridor.connectedRooms.Add(room2);
        int entranceDirection;
        int entranceX = room1.ClampEntranceX(x);
        int entranceY = room1.ClampEntranceY(finish);

        if (!reversed)
        {
            entranceDirection = 2;
        }
        else
        {
            entranceDirection = 0;
        }
        room1.SetEntrance(entranceX, entranceY, entranceDirection);
        if (corridor.xSize > 0)
        {
            building.rooms.Add(corridor);
        }
        building.rooms.Add(corridor);
        for (int y = start; y < finish; y++)
        {
            building.grid[floor, x, y] = "x";
        }
        return(true);
    }
示例#6
0
    private static bool DrawHorizontalCorridor(int floor, int start, int finish, Room room1, Room room2, Dungeon building)
    {
        bool reversed = false;

        if (start > finish)
        {
            var temp = start;
            start    = finish;
            finish   = temp;
            reversed = true;
        }
        int yMin = Mathf.Max(room1.y, room2.y);
        int yMax = Mathf.Min(room1.y + room1.ySize, room2.y + room2.ySize);
        int y    = Random.Range(yMin, yMax);

        if (!LevelGenValidationUtils.ValidHorizontalCorridor(floor, start, finish, y, building))
        {
            return(false);
        }
        int count = 0;

        while (!LevelGenValidationUtils.CanTraceHorizontalLine(y, room1, room2, building.grid) && count < 10000)
        {
            y = Random.Range(yMin, yMax);
            count++;
        }
        if (count >= 10000)
        {
            return(false);
        }
        var corridor = new Corridor {
            x     = start,
            xSize = finish - start,
            y     = y,
            ySize = 1,
            floor = floor
        };

        corridor.connectedRooms.Add(room1);
        corridor.connectedRooms.Add(room2);
        int entranceDirection;
        int entranceX = room1.ClampEntranceX(finish);
        int entranceY = room1.ClampEntranceY(y);

        if (!reversed)
        {
            entranceDirection = 1;
        }
        else
        {
            entranceDirection = 3;
        }
        room1.SetEntrance(entranceX, entranceY, entranceDirection);
        if (corridor.xSize > 0)
        {
            building.rooms.Add(corridor);
        }
        for (int x = start; x < finish; x++)
        {
            building.grid[floor, x, y] = "x";
        }
        return(true);
    }