コード例 #1
0
        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));
        }
コード例 #2
0
        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);
                }
            }
        }