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); }
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); }