Esempio n. 1
0
 protected bool FindPlace(Property.Room roomProp, out IntVector3 position, out IntVector3 entry)
 {
     foreach (Room room in dicRoomList.Values)
     {
         if (room.ConnectorList != null)
         {
             foreach (Connector conn in room.ConnectorList)
             {
                 if (conn.otherConnector == null && !conn.connectorProp.IsDynamic)
                 {
                     Property.ConnectorSocket connSocket = conn.socket as Property.ConnectorSocket;
                     if (connSocket.socketType == Property.ConnectorSocket.TYPE.TYPE_RELATIVE)
                     {
                         position = conn.ConnectToPos;
                         if (roomProp.CanPlaceAt(position))
                         {
                             entry = conn.LogicPosition;
                             return(true);
                         }
                     }
                 }
             }
         }
     }
     position = entry = IntVector3.Zero;
     return(false);
 }
Esempio n. 2
0
    private Room CreateRoomFromStack(Property.RoomFilter filter, bool specified, IntVector3 position, IntVector3 entry)
    {
        if (specified)
        {
            Debug.LogFormat("create room at {0},{1},{2}", position.x, position.y, position.z);
            Room result = null;
            if (dicRoomList.TryGetValue(position, out result) && result != null)
            {
                return(null);
            }
        }

        if (roomQueue.Count == 0)
        {
            RefillRoomQueue(15);
        }

        Property.Room roomProp = null;
        bool          isRoomGood;
        int           count = roomQueue.Count;

        do
        {
            if (--count < 0)
            {
                break;
            }

            roomProp   = roomQueue.Dequeue();
            isRoomGood = filter == null || filter.Check(roomProp);
            isRoomGood = isRoomGood && (specified ? roomProp.CanPlaceAt(position) : FindPlace(roomProp, out position, out entry));
            if (!isRoomGood)
            {
                roomQueue.Enqueue(roomProp);
                roomProp = null;
            }
        } while(!isRoomGood);

        Room roomInst = null;

        if (roomProp != null)
        {
            roomInst = new Room(roomProp);
            //make sure room has a connector to entry
            Rotation2D roomRot = roomInst.FaceTo(entry - position);
            //TODO: after we have position & rotation, check if this room can be placed in scene
            roomInst.Init(position, roomRot, Vector3.zero, Quaternion.identity);
        }

        return(roomInst);
    }