Beispiel #1
0
        void PackRooms()
        {
            for (var i = 0; i < n_i; i++)
            {
                var r = (i * 2) + 1;

                for (var j = 0; j < n_j; j++)
                {
                    var c = (j * 2) + 1;

                    if (tiles[r, c] == TileType.Room)
                    {
                        continue;
                    }

                    if ((i == 0 || j == 0) && Random.Range(0, 2) == 0)
                    {
                        continue;
                    }

                    var roomFootprint = new RoomFootprint();
                    roomFootprint.row = i;
                    roomFootprint.col = j;
                    PlaceRoom(roomFootprint);
                }
            }
        }
Beispiel #2
0
        RoomFootprint SetRoom(RoomFootprint roomFootprint)
        {
            bool heightDefined = roomFootprint.height != 0;
            bool widthDefined  = roomFootprint.width != 0;
            bool rowDefined    = roomFootprint.row != 0;
            bool colDefined    = roomFootprint.col != 0;

            if (!heightDefined)
            {
                if (rowDefined)
                {
                    var a = n_i - room_base - roomFootprint.row;
                    if (a < 0)
                    {
                        a = 0;
                    }

                    var r = (a < room_radix) ? a : room_radix;
                    roomFootprint.height = (int)Random.Range(0, r) + room_base;
                }
                else
                {
                    roomFootprint.height = (int)Random.Range(0, room_radix) + room_base;
                }
            }

            if (!widthDefined)
            {
                if (colDefined)
                {
                    var a = n_j - room_base - roomFootprint.col;
                    if (a < 0)
                    {
                        a = 0;
                    }

                    var r = (a < room_radix) ? a : room_radix;
                    roomFootprint.width = (int)Random.Range(0, r) + room_base;
                }
                else
                {
                    roomFootprint.width = (int)Random.Range(0, room_radix) + room_base;
                }
            }

            if (!rowDefined)
            {
                roomFootprint.row = Random.Range(0, n_i - roomFootprint.height);
            }

            if (!colDefined)
            {
                roomFootprint.col = Random.Range(0, n_j - roomFootprint.width);
            }

            return(roomFootprint);
        }
Beispiel #3
0
        void PlaceRoom(RoomFootprint roomFootprint)
        {
            roomFootprint = SetRoom(roomFootprint);

            var r1 = (roomFootprint.row * 2) + 1;
            var c1 = (roomFootprint.col * 2) + 1;
            var r2 = ((roomFootprint.row + roomFootprint.height) * 2) - 1;
            var c2 = ((roomFootprint.col + roomFootprint.width) * 2) - 1;

            if (r1 < 1 || r2 > max_row)
            {
                return;
            }

            if (c1 < 1 || c2 > max_col)
            {
                return;
            }

            bool hit = RoomCollision(r1, c1, r2, c2);

            if (hit)
            {
                return;
            }

            int room_id = ++n_rooms;

            last_room_id = room_id;

            var room = new Room();

            for (var r = r1; r <= r2; r++)
            {
                for (var c = c1; c <= c2; c++)
                {
                    if (tiles[r, c] == TileType.Entrance)
                    {
                        //          _tiles[r, c] &= ~ ESPACE;
                    }
                    else if (tiles[r, c] == TileType.Perimeter)
                    {
                    }
                    else
                    {
                        tiles[r, c]         = TileType.Room;
                        roomIdForTile[r, c] = room_id;
                    }
                }
            }

            room.tiles = new List <Vector3>();
            for (var r = r1 - 1; r <= r2 + 1; r++)
            {
                for (var c = c1 - 1; c <= c2 + 1; c++)
                {
                    room.tiles.Add(new Vector3(c, 0f, r));
                }
            }

            room.id       = room_id;
            room.row      = r1;
            room.col      = c1;
            room.northRow = r1;
            room.southRow = r2;
            room.westCol  = c1;
            room.eastCol  = c2;
            room.doors    = new List <Door>();

            rooms.Add(room);

            // Perimeters
            for (var r = r1 - 1; r <= r2 + 1; r++)
            {
                if (tiles[r, c1 - 1] != TileType.Room && tiles[r, c1 - 1] != TileType.Entrance)
                {
                    tiles[r, c1 - 1] = TileType.Perimeter;
                }
                if (tiles[r, c2 + 1] != TileType.Room && tiles[r, c2 + 1] != TileType.Entrance)
                {
                    tiles[r, c2 + 1] = TileType.Perimeter;
                }
            }

            for (var c = c1 - 1; c <= c2 + 1; c++)
            {
                if (tiles[r1 - 1, c] != TileType.Room && tiles[r1 - 1, c] != TileType.Entrance)
                {
                    tiles[r1 - 1, c] = TileType.Perimeter;
                }
                if (tiles[r2 + 1, c] != TileType.Room && tiles[r2 + 1, c] != TileType.Entrance)
                {
                    tiles[r2 + 1, c] = TileType.Perimeter;
                }
            }
        }