private Point FindRandomRoomPoint() { //Go down the tree to a random left. When there find a random point in the room and return it Random rand = MapGeneratorBSP.rand; Point retPoint = new Point(-1, -1); //If we have both children choose one if (childLeft != null && childRight != null) { if (rand.Next(2) < 1) { retPoint = childLeft.RandomRoomPoint(); } else { retPoint = childRight.RandomRoomPoint(); } } //Otherwise do the one we have else { if (childLeft != null) { retPoint = childLeft.RandomRoomPoint(); } else { if (childRight != null) { retPoint = childRight.RandomRoomPoint(); } } } //If it's the first leaf we've come to //Find point in the room if (retPoint.x == -1) { int x = roomX + 1 + rand.Next(roomWidth - 2); int y = roomY + 1 + rand.Next(roomHeight - 2); return(new Point(x, y)); } return(retPoint); }
public Map GenerateMap(int extraConnections) { LogFile.Log.LogEntry(String.Format("Generating BSP dungeon")); baseMap = new Map(width, height); //Make a BSP tree for the rooms rootNode = new MapNode(0, 0, width, height); rootNode.Split(); //Draw a room in each BSP leaf rootNode.DrawRoomAtLeaf(baseMap); //debug //Screen.Instance.DrawMapDebug(baseMap); //Draw connecting corridors rootNode.DrawCorridorConnectingChildren(baseMap); //Add any extra connecting corridors as specified for (int i = 0; i < extraConnections; i++) { rootNode.AddRandomConnection(baseMap); } //Add doors where single corridors terminate into rooms AddDoors(); //Turn corridors into normal squares and surround with walls CorridorsIntoRooms(); //Set which squares are light blocking //Now done during creation //SetLightBlocking(baseMap); //Set the PC start location in a random room baseMap.PCStartLocation = rootNode.RandomRoomPoint(); return(baseMap); }
/// <summary> /// Returns only points in rooms (not corridors) /// </summary> /// <returns></returns> public Point RandomPointInRoom() { return(rootNode.RandomRoomPoint()); }
/// <summary> /// Returns only points in rooms (not corridors) /// </summary> /// <returns></returns> public override PointInRoom RandomPointInRoom() { return(rootNode.RandomRoomPoint()); }
public Map GenerateMap(int extraConnections) { LogFile.Log.LogEntry(String.Format("Generating BSPCave dungeon")); baseMap = new Map(width, height); //BSP is always connected baseMap.GuaranteedConnected = true; //Make a BSP tree for the rooms rootNode = new MapNode(this, 0, 0, width, height); rootNode.Split(); //Draw a room in each BSP leaf rootNode.DrawRoomAtLeaf(baseMap); //debug //Screen.Instance.DrawMapDebug(baseMap); //Draw connecting corridors rootNode.DrawCorridorConnectingChildren(baseMap); //Add any extra connecting corridors as specified for (int i = 0; i < extraConnections; i++) { rootNode.AddRandomConnection(baseMap); } //Add doors where single corridors terminate into rooms AddDoors(); //Turn corridors into normal squares and surround with walls CorridorsIntoRooms(); //Now fill all void with walls //Fill the map with walls for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { if (baseMap.mapSquares[i, j].Terrain == MapTerrain.Void) { baseMap.mapSquares[i, j].Terrain = MapTerrain.Wall; } } } //Work out where the staircases will be //We just want 2 places that aren't too close to each other. The map is guaranteed connected double RequiredStairDistance = (width * 0.5); double stairDistance; do { upStaircase = RandomWalkablePoint(); downStaircase = RandomWalkablePoint(); stairDistance = Math.Sqrt(Math.Pow(upStaircase.x - downStaircase.x, 2) + Math.Pow(upStaircase.y - downStaircase.y, 2)); } while (stairDistance < RequiredStairDistance); //Set which squares are light blocking //Now done during creation //SetLightBlocking(baseMap); //Set the PC start location in a random room baseMap.PCStartLocation = rootNode.RandomRoomPoint().GetPointInRoomOnly(); //Now we use the cave algorithm to eat the map //Instead of setting this Empty like in cave, set them to Corridor temporarily (so the algo knows where it's been) DiggingChance = 22; //Start digging from a random point int noDiggingPoints = 6 + Game.Random.Next(2); for (int i = 0; i < noDiggingPoints; i++) { int x = Game.Random.Next(width); int y = Game.Random.Next(height); //Don't dig right to the edge if (x == 0) { x = 1; } if (x == width - 1) { x = width - 2; } if (y == 0) { y = 1; } if (y == height - 1) { y = height - 2; } Dig(x, y); } //Turn the corridors into empty for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { if (baseMap.mapSquares[i, j].Terrain == MapTerrain.Corridor) { baseMap.mapSquares[i, j].Terrain = MapTerrain.Empty; } } } //Do a final pass to convert Wall into something more exciting if (wallType.Count > 0) { for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { if (baseMap.mapSquares[i, j].Terrain == MapTerrain.Wall) { baseMap.mapSquares[i, j].Terrain = wallType[rand.Next(wallType.Count)]; } } } } return(baseMap.Clone()); }
public Map GenerateMap(int extraConnections) { LogFile.Log.LogEntry(String.Format("Generating BSP dungeon")); baseMap = new Map(width, height); //Make a BSP tree for the rooms rootNode = new MapNode(0, 0, width, height); rootNode.Split(); //Draw a room in each BSP leaf rootNode.DrawRoomAtLeaf(baseMap); //debug //Screen.Instance.DrawMapDebug(baseMap); //Draw connecting corridors rootNode.DrawCorridorConnectingChildren(baseMap); //Add any extra connecting corridors as specified for (int i = 0; i < extraConnections; i++) { rootNode.AddRandomConnection(baseMap); } //Add doors where single corridors terminate into rooms AddDoors(); //Turn corridors into normal squares and surround with walls CorridorsIntoRooms(); //Set which squares are light blocking //Now done during creation //SetLightBlocking(baseMap); //Set the PC start location in a random room baseMap.PCStartLocation = rootNode.RandomRoomPoint(); return baseMap; }
public Map GenerateMap(int extraConnections) { LogFile.Log.LogEntry(String.Format("Generating BSPCave dungeon")); baseMap = new Map(width, height); //BSP is always connected baseMap.GuaranteedConnected = true; //Make a BSP tree for the rooms rootNode = new MapNode(this, 0, 0, width, height); rootNode.Split(); //Draw a room in each BSP leaf rootNode.DrawRoomAtLeaf(baseMap); //debug //Screen.Instance.DrawMapDebug(baseMap); //Draw connecting corridors rootNode.DrawCorridorConnectingChildren(baseMap); //Add any extra connecting corridors as specified for (int i = 0; i < extraConnections; i++) { rootNode.AddRandomConnection(baseMap); } //Add doors where single corridors terminate into rooms AddDoors(); //Turn corridors into normal squares and surround with walls CorridorsIntoRooms(); //Now fill all void with walls //Fill the map with walls for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { if (baseMap.mapSquares[i, j].Terrain == MapTerrain.Void) { baseMap.mapSquares[i, j].Terrain = MapTerrain.Wall; } } } //Work out where the staircases will be //We just want 2 places that aren't too close to each other. The map is guaranteed connected double RequiredStairDistance = (width * 0.5); double stairDistance; do { upStaircase = RandomWalkablePoint(); downStaircase = RandomWalkablePoint(); stairDistance = Math.Sqrt(Math.Pow(upStaircase.x - downStaircase.x, 2) + Math.Pow(upStaircase.y - downStaircase.y, 2)); } while (stairDistance < RequiredStairDistance); //Set which squares are light blocking //Now done during creation //SetLightBlocking(baseMap); //Set the PC start location in a random room baseMap.PCStartLocation = rootNode.RandomRoomPoint().GetPointInRoomOnly(); //Now we use the cave algorithm to eat the map //Instead of setting this Empty like in cave, set them to Corridor temporarily (so the algo knows where it's been) DiggingChance = 22; //Start digging from a random point int noDiggingPoints = 6 + Game.Random.Next(2); for (int i = 0; i < noDiggingPoints; i++) { int x = Game.Random.Next(width); int y = Game.Random.Next(height); //Don't dig right to the edge if (x == 0) x = 1; if (x == width - 1) x = width - 2; if (y == 0) y = 1; if (y == height - 1) y = height - 2; Dig(x, y); } //Turn the corridors into empty for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { if (baseMap.mapSquares[i, j].Terrain == MapTerrain.Corridor) { baseMap.mapSquares[i, j].Terrain = MapTerrain.Empty; } } } //Do a final pass to convert Wall into something more exciting if (wallType.Count > 0) { for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { if (baseMap.mapSquares[i, j].Terrain == MapTerrain.Wall) { baseMap.mapSquares[i, j].Terrain = wallType[rand.Next(wallType.Count)]; } } } } return baseMap.Clone(); }