public void GenerateDungeonLevel() { int randomSeed; do { randomSeed = random.Next(60, 100); }while (randomSeed % 4 != 0); Console.WriteLine(randomSeed); myBSPTree = new BSPTree(randomSeed, randomSeed, true); myGrid = new TileGrid(Constants.tileSize, Constants.tileSize, randomSeed, randomSeed); currentLevel = new Level(myGrid); foreach (BSPNode node in myBSPTree.nodes) { if (node.isLeaf()) { currentLevel.rooms.Add(new Room(Room.PlacementType.Floor, myGrid, node.x, node.y, node.width, node.height)); } } foreach (BSPNode hall in myBSPTree.halls) { currentLevel.rooms.Add(new Room(Room.PlacementType.Corridor, myGrid, hall.x, hall.y, hall.width, hall.height)); } BSPNode tempNode = null; foreach (BSPNode node in myBSPTree.nodes) { if (tempNode == null) { tempNode = node; } else if (node.width * node.height < tempNode.width * tempNode.height) { tempNode = node; } } currentLevel.UpdateWalls(); currentLevel.myStartPosition = myGrid.ReturnTileCenter(tempNode.xCenter(), tempNode.yCenter()); levels.AddLevel(currentLevel); }
public void TEST(BSPNode Left, BSPNode Right) { if (Left.isLeaf() && Right.isLeaf()) { CreateHall(Left, Right); } else { if (!Left.isLeaf() && Right.isLeaf()) { if (Left.Left != null && Left.Right != null) { if (Left.Left.xDistanceFromCenter(Right.xCenter()) < Left.Right.xDistanceFromCenter(Right.xCenter()) && Left.Left.yDistanceFromCenter(Right.yCenter()) < Left.Right.yDistanceFromCenter(Right.yCenter())) { TEST(Left.Left, Right); } else { TEST(Left.Right, Right); } } else if (Left.Left != null) { TEST(Left.Left, Right); } else { TEST(Left.Right, Right); } } else if (Left.isLeaf() && !Right.isLeaf()) { if (Right.Left != null && Right.Right != null) { if (Right.Left.xDistanceFromCenter(Left.xCenter()) < Right.Right.xDistanceFromCenter(Left.xCenter()) && Right.Left.yDistanceFromCenter(Right.yCenter()) < Right.Right.yDistanceFromCenter(Left.yCenter())) { TEST(Left, Right.Left); } else { TEST(Left, Right.Right); } } else if (Right.Left != null) { TEST(Left, Right.Left); } else { TEST(Left, Right.Right); } } else { int leftleft_RightX = Math.Abs(Left.Left.xDistanceFromCenter(Right.xCenter())); int leftleft_RightY = Math.Abs(Left.Left.yDistanceFromCenter(Right.yCenter())); int leftleft_RightTot = leftleft_RightX + leftleft_RightY; int leftright_RightX = Math.Abs(Left.Right.xDistanceFromCenter(Right.xCenter())); int leftright_RightY = Math.Abs(Left.Right.yDistanceFromCenter(Right.yCenter())); int leftright_RightTot = leftright_RightX + leftright_RightY; int rightleft_LeftX = Math.Abs(Left.Left.xDistanceFromCenter(Left.xCenter())); int rightleft_LeftY = Math.Abs(Left.Left.yDistanceFromCenter(Left.yCenter())); int rightleft_LeftTot = rightleft_LeftX + rightleft_LeftY; int rightright_LeftX = Math.Abs(Left.Right.xDistanceFromCenter(Left.xCenter())); int rightright_LeftY = Math.Abs(Left.Right.yDistanceFromCenter(Left.yCenter())); int rightright_LeftTot = rightright_LeftX + rightright_LeftY; // find left if (leftleft_RightTot < leftright_RightTot) { //Find right if (rightleft_LeftTot < rightright_LeftTot) { TEST(Left.Left, Right.Left); } else { TEST(Left.Left, Right.Right); } } else { //Find right if (rightleft_LeftTot < rightright_LeftTot) { TEST(Left.Right, Right.Left); } else { TEST(Left.Right, Right.Right); } } } } }