public PrototypeDungeon BuildPrototype() { InitVirtualSpace(); DungeonNode firstElement = _loadedStructure.StartElement; var firstRoom = GetRandomRoom(firstElement); var firstRoomWrapper = new RoomPrototype( firstElement, firstRoom, Vector3.zero, Quaternion.identity); firstRoomWrapper.ConnectToParent(null, null); if (!TryAddRoomToVirtualSpace(firstRoomWrapper, null)) { throw new Exception("Could not place first element!"); } TryCreateDungeonStructure(firstRoomWrapper); firstRoomWrapper.ActualGraphElement.MetaData.AddTag("ROOT"); firstRoomWrapper.ActualGraphElement.TraverseDepthFirst().ForEach(n => n.MetaData.AddTag(MAIN_TAG)); CreateBranches(firstRoomWrapper); CloseOpenConnections(firstRoomWrapper); return(new PrototypeDungeon(firstRoomWrapper, _loadedStructure)); }
private IEnumerable <RoomPrototype> GetPossibleRoomsForConnection(RoomPrototypeConnection baseConnection, DungeonNode nextStructureElement) { var baseRoom = baseConnection.ParentRoomPrototype; foreach (var newRoom in GetRandomOrderedRooms(nextStructureElement)) { IEnumerable <RoomConnector> possibleNextConnections = newRoom .GetConnections() .Where(x => x.size.Equals(baseConnection.ParentConnection.size) && x.type == baseConnection.ParentConnection.type) .ToList().Shuffle(_random); foreach (var nextRoomConnection in possibleNextConnections) { var nextRoomConnectionTransform = nextRoomConnection.transform; var selectedConnectionTransform = baseConnection.ParentConnection.transform; GetNewRoomPosAndRot(baseRoom.GlobalPosition, baseRoom.Rotation, selectedConnectionTransform, nextRoomConnectionTransform, out var newRoomPosition, out var rotationDiff); var nextRoomWrapper = new RoomPrototype(nextStructureElement, newRoom, newRoomPosition, rotationDiff); if (!TryAddRoomToVirtualSpace(nextRoomWrapper, baseRoom)) { continue; } nextRoomWrapper.ConnectToParent(nextRoomConnection, baseConnection); yield return(nextRoomWrapper); } } }