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);
 }
Esempio n. 3
0
    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());
    }
Esempio n. 4
0
 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);
             }
         }
     }
 }