public List <Node> CalculateDungeon( int maxIterations, int roomWidthMin, int roomLengthMin, float roomBottomCornerModifier, float roomTopCornerModifier, int roomOffset, int corridorWidth) { //splits the room BinarySpacePartitioner bsp = new BinarySpacePartitioner(dungeonWidth, dungeonLength); allNodesCollection = bsp.PrepareNodesCollection(maxIterations, roomWidthMin, roomLengthMin); List <Node> roomSpaces = StructureHelper.TraverseGraphToExtractLowestLeafes(bsp.RootNode); RoomGenerator roomGenerator = new RoomGenerator(maxIterations, roomLengthMin, roomWidthMin); List <RoomNode> roomList = roomGenerator.GenerateRoomsInGivenSpace(roomSpaces, roomBottomCornerModifier, roomTopCornerModifier, roomOffset); CorridorGenerator corridorGenerator = new CorridorGenerator(); var corridorList = corridorGenerator.CreateCorridor(allNodesCollection, corridorWidth); return(new List <Node>(roomList).Concat(corridorList).ToList()); }
//finds the closest X coordinates from adjacent rooms from right corner to clostest right corner private void ProcessRoomInRelationRightOrLeft(Node structure1, Node structure2) { Node leftStructure = null; List <Node> leftStructureChildren = StructureHelper.TraverseGraphToExtractLowestLeafes(structure1); Node rightStructure = null; List <Node> rightStructureChildren = StructureHelper.TraverseGraphToExtractLowestLeafes(structure2); var sortedLeftStructure = leftStructureChildren.OrderByDescending(child => child.TopRightAreaCorner.x).ToList(); if (sortedLeftStructure.Count == 1) { leftStructure = sortedLeftStructure[0]; } else { int maxX = sortedLeftStructure[0].TopRightAreaCorner.x; sortedLeftStructure = sortedLeftStructure.Where(children => Math.Abs(maxX - children.TopRightAreaCorner.x) < 10).ToList(); int index = UnityEngine.Random.Range(0, sortedLeftStructure.Count); leftStructure = sortedLeftStructure[index]; } var possibleNeighboursInRightStructureList = rightStructureChildren.Where( child => GetValidYForNeighbourLeftRight( leftStructure.TopRightAreaCorner, leftStructure.BottomRightAreaCorner, child.TopLeftAreaCorner, child.BottomLeftAreaCorner) != -1 ).ToList(); if (possibleNeighboursInRightStructureList.Count <= 0) { rightStructure = structure2; } else { rightStructure = possibleNeighboursInRightStructureList[0]; } int y = GetValidYForNeighbourLeftRight( leftStructure.TopLeftAreaCorner, leftStructure.BottomRightAreaCorner, rightStructure.TopLeftAreaCorner, rightStructure.BottomLeftAreaCorner); while (y == -1 && sortedLeftStructure.Count > 1) { sortedLeftStructure = sortedLeftStructure.Where(child => child.TopLeftAreaCorner.y != leftStructure.TopLeftAreaCorner.y).ToList(); leftStructure = sortedLeftStructure[0]; y = GetValidYForNeighbourLeftRight( leftStructure.TopLeftAreaCorner, leftStructure.BottomRightAreaCorner, rightStructure.TopLeftAreaCorner, rightStructure.BottomLeftAreaCorner); } BottomLeftAreaCorner = new Vector2Int(leftStructure.BottomRightAreaCorner.x, y); TopRightAreaCorner = new Vector2Int(rightStructure.TopLeftAreaCorner.x, y + this.corridorWidth); }
private void ProcessRoomInRelationUpOrDown(Node structure1, Node structure2) { Node bottomStructure = null; List <Node> structureBottmChildren = StructureHelper.TraverseGraphToExtractLowestLeafes(structure1); Node topStructure = null; List <Node> structureAboveChildren = StructureHelper.TraverseGraphToExtractLowestLeafes(structure2); var sortedBottomStructure = structureBottmChildren.OrderByDescending(child => child.TopRightAreaCorner.y).ToList(); if (sortedBottomStructure.Count == 1) { bottomStructure = structureBottmChildren[0]; } else { int maxY = sortedBottomStructure[0].TopLeftAreaCorner.y; sortedBottomStructure = sortedBottomStructure.Where(child => Mathf.Abs(maxY - child.TopLeftAreaCorner.y) < 10).ToList(); int index = UnityEngine.Random.Range(0, sortedBottomStructure.Count); bottomStructure = sortedBottomStructure[index]; } var possibleNeighboursInTopStructure = structureAboveChildren.Where( child => GetValidXForNeighbourUpDown( bottomStructure.TopLeftAreaCorner, bottomStructure.TopRightAreaCorner, child.BottomLeftAreaCorner, child.BottomRightAreaCorner) != -1).OrderBy(child => child.BottomRightAreaCorner.y).ToList(); if (possibleNeighboursInTopStructure.Count == 0) { topStructure = structure2; } else { topStructure = possibleNeighboursInTopStructure[0]; } int x = GetValidXForNeighbourUpDown( bottomStructure.TopLeftAreaCorner, bottomStructure.TopRightAreaCorner, topStructure.BottomLeftAreaCorner, topStructure.BottomRightAreaCorner); while (x == -1 && sortedBottomStructure.Count > 1) { sortedBottomStructure = sortedBottomStructure.Where(child => child.TopLeftAreaCorner.x != topStructure.TopLeftAreaCorner.x).ToList(); bottomStructure = sortedBottomStructure[0]; x = GetValidXForNeighbourUpDown( bottomStructure.TopLeftAreaCorner, bottomStructure.TopRightAreaCorner, topStructure.BottomLeftAreaCorner, topStructure.BottomRightAreaCorner); } BottomLeftAreaCorner = new Vector2Int(x, bottomStructure.TopLeftAreaCorner.y); TopRightAreaCorner = new Vector2Int(x + this.corridorWidth, topStructure.BottomLeftAreaCorner.y); }
public List <Node> CalculateRooms(int maxIteration, int roomWidthMin, int roomLengthMin) { BinarySpacePartitioner bsp = new BinarySpacePartitioner(dungeonWidth, dungeonLength); allSpaceNodes = bsp.PrepareNodesCollection(maxIteration, roomWidthMin, roomLengthMin); List <Node> roomSpaces = StructureHelper.TraverseGraphToExtractLowestLeafes(bsp.RootNode); RoomGenerator roomGenerator = new RoomGenerator(maxIteration, roomLengthMin, roomWidthMin); List <RoomNode> roomList = roomGenerator.GenerateRoomsInGivenSpaces(roomSpaces); return(new List <Node>(allSpaceNodes)); }