Beispiel #1
0
    private bool AddRoomRandom(RoomComposite composite, RCObj RCOrig, FlowNode nodeNew)
    {
        RoomData roomNew;
        RCObj    RCNew;

        // try adding first 2 rooms together
        for (int i = 0; i < MAX_TRIES; i++)
        {
            roomNew = GetRoom(nodeNew);
            RCNew   = new RCObj(roomNew);

            bool didAdd = TryCombiningRooms(composite, RCOrig, RCNew, RCOrig.GetAvailableConnections());
            if (didAdd)
            {
                if (!AddNode(nodeNew, RCNew))
                {
                    return(false); // couldn't generate complex hallway
                }
                return(true);
            }
        }
        return(false);
    }
Beispiel #2
0
    private RoomComposite AddCycleToComposite(RoomComposite composite, RCObj RCA, List <FlowNode> cycle)
    {
        FlowNode nodeN = cycle[1];
        RoomData roomN = null;
        RCObj    RCN   = null;

        bool didAdd = false;

        if (!addedNodes.ContainsKey(cycle[1]))
        {
            // try adding first 2 rooms together
            for (int i = 0; i < MAX_TRIES; i++)
            {
                roomN = GetRoom(nodeN);
                RCN   = new RCObj(roomN);

                didAdd = TryCombiningRooms(composite, RCA, RCN, RCA.GetAvailableConnections());
                if (didAdd)
                {
                    if (!AddNode(nodeN, RCN))
                    {
                        return(null); // couldn't generate complex hallway
                    }
                    break;
                }
            }

            // failed to place first two rooms
            if (!didAdd)
            {
                return(null);
            }
        }
        else
        {
            RCN = addedNodes[nodeN];
        }


        // place rest of rooms
        for (int n = 2; n < cycle.Count; n++)
        {
            didAdd = false;

            FlowNode nodeM = cycle[n];

            if (!addedNodes.ContainsKey(nodeM))
            {
                int[] indsN;
                // get furthest dir
                if (n < (cycle.Count + 1) / 2)
                {
                    indsN = RCN.GetFurthestConnection(RCA, 3);
                }
                else // get closest dir
                {
                    indsN = RCN.GetClosestConnections(RCA, 3);
                }
                if (indsN[0] == -1)
                {
                    continue;
                }

                for (int i = 0; i < MAX_TRIES; i++)
                {
                    RoomData roomM = GetRoom(nodeM);
                    RCObj    RCM   = new RCObj(roomM);

                    didAdd = TryCombiningRooms(composite, RCN, RCM, indsN);

                    if (didAdd)
                    {
                        if (!AddNode(nodeM, RCM))
                        {
                            return(null); // couldn't generate complex hallway
                        }
                        RCN = RCM;
                        break;
                    }
                }

                if (!didAdd)
                {
                    return(null); // restart composite
                }
            }
            else
            {
                // already added
                RCN = addedNodes[nodeM];
            }
        }

        //if (!composite.TryGenerateComplexHallway(RCN, RCA))
        //    return null; // couldnt do the last hallway :(

        // succeeded
        //Debug.Log("Rooms added successfully!");
        return(composite);
    }