private static string TryGenerateMap(IMapGenerationParams mapParams) { var rooms = RoomGenerator.GenerateRooms(mapParams); var corridors = CorridorGenerator.ConnectRooms(mapParams, rooms); return(PrintBoard(mapParams, rooms, corridors)); }
private static bool TryToExpand( IMapGenerationParams mapParams, List <Room> rooms, Room room ) { var expanded = false; if (mapParams.RoomExpandCheck() && CanExpandLeft(mapParams, rooms, room)) { room.TilePos = room.TilePos.Substract(x: 1); room.Size = room.Size.Add(width: 1); expanded = true; } if (mapParams.RoomExpandCheck() && CanExpandRight(mapParams, rooms, room)) { room.Size = room.Size.Add(width: 1); expanded = true; } if (mapParams.RoomExpandCheck() && CanExpandUp(mapParams, rooms, room)) { room.TilePos = room.TilePos.Substract(y: 1); room.Size = room.Size.Add(height: 1); expanded = true; } if (mapParams.RoomExpandCheck() && CanExpandDown(mapParams, rooms, room)) { room.Size = room.Size.Add(height: 1); expanded = true; } return(expanded); }
public static string GenerateMap(IMapGenerationParams mapParams) { try { return(TryGenerateMap(mapParams)); } catch (InvalidMapException) { return(string.Empty); } }
private static bool CanExpandUp( IMapGenerationParams mapParams, List <Room> rooms, Room room ) { var targetY = room.TilePos.Y - 1; if (targetY <= 0) { return(false); } return(CanExpandVertically(mapParams, rooms, room, targetY)); }
private static bool CanExpandDown( IMapGenerationParams mapParams, List <Room> rooms, Room room ) { var targetY = room.TilePos.Y + room.Size.Height; if (targetY >= mapParams.Height - 1) { return(false); } return(CanExpandVertically(mapParams, rooms, room, targetY)); }
private static bool CanExpandRight( IMapGenerationParams mapParams, List <Room> rooms, Room room ) { var targetX = room.TilePos.X + room.Size.Width; if (targetX >= mapParams.Width - 1) { return(false); } return(CanExpandHorizontally(mapParams, rooms, room, targetX)); }
private static bool CanExpandLeft( IMapGenerationParams mapParams, List <Room> rooms, Room room ) { var targetX = room.TilePos.X - 1; if (targetX <= 0) { return(false); } return(CanExpandHorizontally(mapParams, rooms, room, targetX)); }
private static bool CanExpandVertically( IMapGenerationParams mapParams, List <Room> rooms, Room room, int targetY ) { var fromX = room.TilePos.X; var toX = room.TilePos.X + room.Size.Width; return(rooms .Where(r => r != room) .All(r => !r.Intersects( new Point(fromX, targetY), new Size(toX - fromX, 1), mapParams.MinRoomSeparation ))); }
private static bool CanExpandHorizontally( IMapGenerationParams mapParams, List <Room> rooms, Room room, int targetX ) { var fromY = room.TilePos.Y; var toY = room.TilePos.Y + room.Size.Height; return(rooms .Where(r => r != room) .All(r => !r.Intersects( new Point(targetX, fromY), new Size(1, toY - fromY), mapParams.MinRoomSeparation ))); }
private static void AddNewRoom(IMapGenerationParams mapParams, List <Room> rooms) { var newRoom = new Room() { TilePos = new Point( x: Luck.Next(1, mapParams.Width - 1), // external wall border required y: Luck.Next(1, mapParams.Height - 1) // external wall border required ), Size = new Size(1, 1) }; var isNotAdjacentToOtherRooms = rooms .All(room => !room.Intersects(newRoom, mapParams.MinRoomSeparation)); if (isNotAdjacentToOtherRooms) { rooms.Add(newRoom); } }
private static string PrintBoard( IMapGenerationParams mapParams, List <Room> rooms, List <Corridor> corridors ) { var board = ""; for (var y = 0; y < mapParams.Height; y++) { var boardRow = ""; for (var x = 0; x < mapParams.Width; x++) { var tile = new Point(x, y); boardRow += rooms.Any(room => room.HasTile(tile)) ? "T" : corridors.Any(c => c.Tiles.Contains(tile)) ? "t" : "."; } board += boardRow + Environment.NewLine; } return(board); }
public static List <Room> GenerateRooms(IMapGenerationParams mapParams) { var rooms = new List <Room>(); var area = mapParams.Width * mapParams.Height; while (rooms.Count < mapParams.InitialRooms) { AddNewRoom(mapParams, rooms); } var whileLoops = 0; while (true) { whileLoops++; if (whileLoops > INITIAL_ROOMS_MAX_LOOPS) { throw new InvalidMapException("Creating initial rooms"); } foreach (var room in rooms) { var expanded = TryToExpand(mapParams, rooms, room); if (expanded) { var roomsWithMinSize = rooms .Where(room => room.HasMinSize(mapParams.MinRoomSize)) .ToList(); var roomArea = (float)roomsWithMinSize.Sum(room => room.Area); var density = roomArea / area; if (density >= mapParams.MinDensity) { return(roomsWithMinSize); } } } } }
private static bool CreateCorridor( IMapGenerationParams mapParams, List <Room> rooms, List <Corridor> corridors ) { var corridorWidth = mapParams.GetRandomCorridorWidth(); var wideIndexList = Enumerable.Range(0, corridorWidth).ToList(); var(startRoom, startTiles, direction) = GetStartTiles(rooms, corridors, corridorWidth, wideIndexList); if (startRoom == null) { return(false); } var newCorridor = new Corridor(); newCorridor.Rooms.Add(startRoom); var endRooms = ExpandCorridor( mapParams, corridors, newCorridor, corridorWidth, wideIndexList, startTiles, direction, rooms ); if (endRooms == null || !endRooms.Any()) { return(false); } startRoom.Corridors.Add(newCorridor); newCorridor.Rooms.AddRange(endRooms); endRooms.ForEach(endRoom => endRoom.Corridors.Add(newCorridor)); corridors.Add(newCorridor); return(true); }
public static List <Corridor> ConnectRooms( IMapGenerationParams mapParams, List <Room> rooms ) { var corridors = new List <Corridor>(); var whileLoops = 0; while (true) { whileLoops++; if (whileLoops > CONNECT_ROOMS_MAX_LOOPS) { throw new InvalidMapException("Connecting rooms"); } var added = CreateCorridor(mapParams, rooms, corridors); if (added && AreAllConnected(rooms)) { break; } } return(corridors); }