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