private int PlaceRandomConnectedRooms(TemplatedMapGenerator templatedGenerator, int roomsToPlace, int maxRoomDistance) { int roomsPlaced = 0; int attempts = 0; //This uses random distances and their might be collisions so we should avoid infinite loops int maxAttempts = roomsToPlace * 5; //Terminate when all rooms placed or no more potential door sites do { if (roomsPlaced == 0) { //Place a random room at a location near the origin try { templatedGenerator.PlaceRoomTemplateAtPosition(RandomRoom(), new Point(Game.Random.Next(maxRoomDistance), Game.Random.Next(maxRoomDistance))); roomsPlaced++; } catch (ApplicationException) { } attempts++; } else { //Find a random potential door and try to grow a random room off this var randomRoom = RandomRoom(); var randomDoorInRoom = Game.Random.Next(randomRoom.PotentialDoors.Count); try { templatedGenerator.PlaceRoomTemplateAlignedWithExistingDoor(randomRoom, corridorTemplates[0], RandomDoor(templatedGenerator), randomDoorInRoom, Game.Random.Next(maxRoomDistance)); roomsPlaced++; } catch (ApplicationException) { } attempts++; } } while (roomsPlaced < roomsToPlace && attempts < maxAttempts && templatedGenerator.HaveRemainingPotentialDoors()); return(roomsPlaced); }
private int PlaceRandomConnectedRooms(TemplatedMapGenerator templatedGenerator, int roomsToPlace, RoomTemplate roomToPlace, RoomTemplate corridorToPlace, int minCorridorLength, int maxCorridorLength, Func <int> doorPicker) { int roomsPlaced = 0; int attempts = 0; //This uses random distances and their might be collisions so we should avoid infinite loops int maxAttempts = roomsToPlace * 5; //Terminate when all rooms placed or no more potential door sites do { //Find a random potential door and try to grow a random room off this //Use a random door, or the function passed in int randomNewDoorIndex; if (doorPicker == null) { //Random door randomNewDoorIndex = Game.Random.Next(roomToPlace.PotentialDoors.Count); } else { randomNewDoorIndex = doorPicker(); } int corridorLength = Game.Random.Next(minCorridorLength, maxCorridorLength); try { templatedGenerator.PlaceRoomTemplateAlignedWithExistingDoor(roomToPlace, corridorToPlace, RandomDoor(templatedGenerator), randomNewDoorIndex, corridorLength); roomsPlaced++; } catch (ApplicationException) { } attempts++; } while (roomsPlaced < roomsToPlace && attempts < maxAttempts && templatedGenerator.HaveRemainingPotentialDoors()); return(roomsPlaced); }