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); } } }
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); }
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; } } }