private int GetValidXForNeighbourUpDown(Vector2Int bottomNodeLeft, Vector2Int bottomNodeRight, Vector2Int topNodeLeft, Vector2Int topNodeRight) { if (topNodeLeft.x < bottomNodeLeft.x && bottomNodeRight.x < topNodeRight.x) { return(StructureHelper.CalculateMiddlePoint( bottomNodeLeft + new Vector2Int(modifierDistanceFromWall, 0), bottomNodeRight - new Vector2Int(this.corridorWidth + modifierDistanceFromWall, 0) ).x); } if (topNodeLeft.x >= bottomNodeLeft.x && bottomNodeRight.x >= topNodeRight.x) { return(StructureHelper.CalculateMiddlePoint( topNodeLeft + new Vector2Int(modifierDistanceFromWall, 0), topNodeRight - new Vector2Int(this.corridorWidth + modifierDistanceFromWall, 0) ).x); } if (bottomNodeLeft.x >= (topNodeLeft.x) && bottomNodeLeft.x <= topNodeRight.x) { return(StructureHelper.CalculateMiddlePoint( bottomNodeLeft + new Vector2Int(modifierDistanceFromWall, 0), topNodeRight - new Vector2Int(this.corridorWidth + modifierDistanceFromWall, 0) ).x); } if (bottomNodeRight.x <= topNodeRight.x && bottomNodeRight.x >= topNodeLeft.x) { return(StructureHelper.CalculateMiddlePoint( topNodeLeft + new Vector2Int(modifierDistanceFromWall, 0), bottomNodeRight - new Vector2Int(this.corridorWidth + modifierDistanceFromWall, 0) ).x); } return(-1); }
private int GetValidYForNeighourLeftRight(Vector2Int leftNodeUp, Vector2Int leftNodeDown, Vector2Int rightNodeUp, Vector2Int rightNodeDown) { if (rightNodeUp.y >= leftNodeUp.y && leftNodeDown.y >= rightNodeDown.y) { return(StructureHelper.CalculateMiddlePoint( leftNodeDown + new Vector2Int(0, modifierDistanceFromWall), leftNodeUp - new Vector2Int(0, modifierDistanceFromWall + this.corridorWidth) ).y); } if (rightNodeUp.y <= leftNodeUp.y && leftNodeDown.y <= rightNodeDown.y) { return(StructureHelper.CalculateMiddlePoint( rightNodeDown + new Vector2Int(0, modifierDistanceFromWall), rightNodeUp - new Vector2Int(0, modifierDistanceFromWall + this.corridorWidth) ).y); } if (leftNodeUp.y >= rightNodeDown.y && leftNodeUp.y <= rightNodeUp.y) { return(StructureHelper.CalculateMiddlePoint( rightNodeDown + new Vector2Int(0, modifierDistanceFromWall), leftNodeUp - new Vector2Int(0, modifierDistanceFromWall) ).y); } if (leftNodeDown.y >= rightNodeDown.y && leftNodeDown.y <= rightNodeUp.y) { return(StructureHelper.CalculateMiddlePoint( leftNodeDown + new Vector2Int(0, modifierDistanceFromWall), rightNodeUp - new Vector2Int(0, modifierDistanceFromWall + this.corridorWidth) ).y); } return(-1); }
public List <Node> CalculateDungeon(int maxPasses, int roomMinWidth, int roomMinLength, float bottomCornerModifier, float topCornerModifier, int roomOffset, int corridorWidth, EnemySpawner enemSpawner, DungeonCreator dungeonCreator, ItemSpawner itemSpawner, ObjectSpawner objSpawner) { BinarySpacePartitioner bsp = new BinarySpacePartitioner(dungeonWidth, dungeonLength); allSpaceNodes = bsp.PrepareNodesCollection(maxPasses, roomMinWidth, roomMinLength); List <Node> roomSpaces = StructureHelper.TraverseGraphToExtractLowestLeaves(bsp.rootNode); RoomGenerator roomGenerator = new RoomGenerator(maxPasses, roomMinLength, roomMinWidth); List <RoomNode> roomList = roomGenerator.GenerateRoomsInGivenSpaces(roomSpaces, bottomCornerModifier, topCornerModifier, roomOffset); //first room will be the spawn point for the player RoomNode firstRoom = roomList[0]; UnityEngine.CharacterController player = GameObject.FindWithTag("Player").GetComponent <UnityEngine.CharacterController>(); Vector2Int firstRoomCenter = StructureHelper.CalculateMiddlePoint(firstRoom.BottomLeftCorner, firstRoom.TopRightCorner); Vector3 newPos = new Vector3(firstRoomCenter.x, 0.0f, firstRoomCenter.y); player.enabled = false; player.transform.position = newPos; player.enabled = true; //generate spawn points before we add the corridors for (int i = 0; i < roomList.Count; i++) { RoomNode room = roomList[i]; if (enemSpawner != null) { GameObject newRoom = new GameObject("RoomObj", typeof(Room), typeof(BoxCollider)); newRoom.tag = "RoomObject"; BoxCollider col = newRoom.GetComponent <BoxCollider>(); col.isTrigger = true; col.size = new Vector3(1.2f, 1.2f, 1.2f); Vector2Int roomPos = StructureHelper.CalculateMiddlePoint(room.BottomLeftCorner, room.TopRightCorner); newRoom.transform.position = new Vector3(roomPos.x, 2, roomPos.y); Room roomComp = newRoom.GetComponent <Room>(); room.roomObjReference = roomComp; newRoom.transform.localScale = new Vector3(room.Width, 4, room.Length); roomComp.enemySpawnPoints = new List <Vector3>(); roomComp.itemSpawnPoints = new List <Vector3>(); roomComp.weaponSpawnPoints = new List <Vector3>(); roomComp.objectSpawnPoints = new List <Vector3>(); roomComp.doors = new List <Transform>(); dungeonCreator.spawnedRooms.Add(roomComp); if (i != 0) { enemSpawner.GenerateEnemySpawnPointsForRoom(room); itemSpawner.GenerateItemSpawnPointsForRoom(room); objSpawner.GenerateObjectSpawnPointsForRoom(room); } } } CorridorGenerator corridorGenerator = new CorridorGenerator(); var corridorList = corridorGenerator.CreateCorridor(allSpaceNodes, corridorWidth); dungeonCreator.GenerateDoors(corridorList); return(new List <Node>(roomList).Concat(corridorList).ToList()); }
public void GenerateDoors(List <Node> corridors) { foreach (CorridorNode node in corridors) { if (node.connectedRooms[0] != null && node.connectedRooms[1] != null) { Vector2Int center = StructureHelper.CalculateMiddlePoint(node.BottomLeftCorner, node.TopRightCorner); if (node.orientation == RelativePosition.Up || node.orientation == RelativePosition.Down) { GameObject newDoor = Instantiate(doorObject, new Vector3(center.x, 0, center.y), Quaternion.Euler(new Vector3(-90, 0, 0))); node.connectedRooms[0].doors.Add(newDoor.transform); node.connectedRooms[1].doors.Add(newDoor.transform); } else { GameObject newDoor = Instantiate(doorObject, new Vector3(center.x, 0, center.y), Quaternion.Euler(new Vector3(-90, 90, 0))); node.connectedRooms[0].doors.Add(newDoor.transform); node.connectedRooms[1].doors.Add(newDoor.transform); } } } }