public bool TryAddRoom(Room room) { if (!IntersectsExistingRooms(room)) { _rooms.Add(room); GenerateTilesForRoom(room, _tiles, _tileDim); return true; } return false; }
static void GenerateTilesForRoom(Room room, Tile[] ts, int tileDim) { int x = room.X; int y = room.Y; int w = room.W; int h = room.H; for (int xi = x; xi <= x + w; xi++) { for (int yi = y; yi <= y + h; yi++) { int num = yi * tileDim + xi; ts[num].Type = TileType.Room; } } }
bool IntersectsExistingRooms(Room room) { // manual foreach is a lot faster than Any here foreach (var r in _rooms) { if (r.Intersects(room)) return true; } return false; }
public bool Intersects(Room otherRoom) { var roomDoesntIntersect = (X + W + 1) < otherRoom.X || X > (otherRoom.X + otherRoom.W + 1) || (Y + H + 1) < otherRoom.Y || Y > (otherRoom.Y + otherRoom.H + 1); return !roomDoesntIntersect; }
public IEnumerable<Level> MakeLevels(LevelSettings settings) { while(true) { var lev = new Level(settings.MaxRooms, settings.TileDim); int roomCount = 0; for (int attempt = 0; attempt < settings.RoomInsertionAttempts; attempt++) { var x = _rand.Next() % settings.TileDim; var y = _rand.Next() % settings.TileDim; var w = _rand.Next() % settings.RestWidMax + settings.WidMin; var h = _rand.Next() % settings.RestWidMax + settings.WidMin; if (x + w >= settings.TileDim || y + h >= settings.TileDim || x == 0 || y == 0) continue; var room = new Room{X=x, Y=y, W=w, H=h}; if (lev.TryAddRoom(room)) { if (++roomCount == settings.MaxRooms) break; } } yield return lev; } }