bool CreateCorridorRecursivly(cRoom room)
    {
        ////randomly choose a room
        //cRoom room = roomList[Random.Range(0, roomList.Count - 1)];

        int deltaX, deltaZ;
        int wallX, wallZ;//target wall pos
        switch (Random.Range(1,4)) {
        //randomly choose a direction (for corridor)
        case 1:
            //up
            deltaX = 0;
            deltaZ = 1;
            wallX = Random.Range (room.x + 1, room.x + room.xWidth - 2);
            wallZ = room.z + room.zLength - 1;
            if (_mapInfo[wallX,wallZ] != -1 || _mapInfo[wallX-1,wallZ] != -1 || _mapInfo[wallX+1,wallZ] != -1) {
                return false;
            }
            break;
        case 2:
            //down
            deltaX = 0;
            deltaZ = -1;
            wallX = Random.Range (room.x + 1, room.x + room.xWidth - 2);
            wallZ = room.z;
            if (_mapInfo[wallX,wallZ] != -1 || _mapInfo[wallX-1,wallZ] != -1 || _mapInfo[wallX+1,wallZ] != -1) {
                return false;
            }
            break;
        case 3:
            //left
            deltaX = -1;
            deltaZ = 0;
            wallX = room.x;
            wallZ = Random.Range (room.z + 1, room.z + room.zLength - 2);
            if (_mapInfo[wallX,wallZ] != -1 || _mapInfo[wallX,wallZ-1] != -1 || _mapInfo[wallX,wallZ+1] != -1) {
                return false;
            }
            break;
        case 4:
            //right
            deltaX = 1;
            deltaZ = 0;
            wallX = room.x+room.xWidth-1;
            wallZ = Random.Range (room.z + 1, room.z + room.zLength - 2);
            if (_mapInfo[wallX,wallZ] != -1 || _mapInfo[wallX,wallZ-1] != -1 || _mapInfo[wallX,wallZ+1] != -1) {
                return false;
            }
            break;
        default:
            deltaX = 0;
            deltaZ = 0;
            wallX = 0;
            wallZ = 0;
            Debug.LogError ("Invalid Direction!");
            break;
        }
        int corridorLength = Random.Range (_corridorMinLength, _corridorMaxLength);
        if (!CheckCorridorSpace(
            wallX + deltaX,
            wallZ + deltaZ,
            deltaX,
            deltaZ,
            corridorLength
        )) {
            return false;
        }
        currentMapElemId++;
        currentCorridor = new cCorridor (
            currentMapElemId,
            wallX + deltaX,
            wallZ + deltaZ,
            deltaX,
            deltaZ,
            corridorLength
        );
        _mapInfo [wallX, wallZ] = room.id;//remove wall
        UpdateMapInfo (currentCorridor);
        corridorList.Add (currentCorridor);
        return true;
    }
 bool CreateRoomRecursivly(cCorridor corridor)
 {
     int jointX = corridor.x + corridor.deltaX * (corridor.length+1);//wall length add 1 for wall
     int jointZ = corridor.z + corridor.deltaZ * (corridor.length+1);
     int roomX, roomZ;
     int widthX = Random.Range (_roomMinRange, _roomMaxRange);
     int lengthZ = Random.Range (_roomMinRange, _roomMaxRange);
     if (corridor.deltaX == 0) {
         if (corridor.deltaZ == 1) {
             //joint on room down
             roomX = jointX - Random.Range(1, widthX-2);
             roomZ = jointZ;
         } else {
             //joint on room up
             roomX = jointX - Random.Range(1, widthX-2);
             roomZ = jointZ - lengthZ + 1;
         }
     } else {
         if (corridor.deltaX == 1) {
             //joint on room left
             roomX = jointX;
             roomZ = jointZ - Random.Range (1, lengthZ-2);
         } else {
             //joint on room right
             roomX = jointX - widthX + 1;
             roomZ = jointZ - Random.Range (1, lengthZ-2);
         }
     }
     if (!CheckRoomSpace(
         roomX,
         roomZ,
         widthX,
         lengthZ
     )) {
         return false;
     }
     currentMapElemId++;
     currentRoom = new cRoom(
         currentMapElemId,
         roomX,
         roomZ,
         widthX,
         lengthZ
     );
     UpdateMapInfo(currentRoom);
     roomList.Add(currentRoom);
     _mapInfo [corridor.x + corridor.deltaX * corridor.length, corridor.z + corridor.deltaZ * corridor.length] = corridor.id;
     _mapInfo [jointX, jointZ] = currentRoom.id;
     corridor.exitList.Clear ();
     return true;
 }
 void UpdateMapInfo(cCorridor corridor)
 {
     int index = 0;
     int wallDelX = Mathf.Abs(corridor.deltaX) ^ 1;
     int wallDelZ = Mathf.Abs(corridor.deltaZ) ^ 1;
     while (index<corridor.length) {
         _mapInfo [corridor.x + corridor.deltaX * index, corridor.z + corridor.deltaZ * index] = corridor.id;
         _mapInfo [corridor.x + corridor.deltaX * index + wallDelX, corridor.z + corridor.deltaZ * index + wallDelZ] = -1;
         _mapInfo [corridor.x + corridor.deltaX * index - wallDelX, corridor.z + corridor.deltaZ * index - wallDelZ] = -1;
         index++;
     }
     _mapInfo [corridor.x + corridor.deltaX * index, corridor.z + corridor.deltaZ * index] = -1;
     _mapInfo [corridor.x + corridor.deltaX * index + wallDelX, corridor.z + corridor.deltaZ * index + wallDelZ] = -1;
     _mapInfo [corridor.x + corridor.deltaX * index - wallDelX, corridor.z + corridor.deltaZ * index - wallDelZ] = -1;
 }
 bool CreateCorridorRecursivly(cCorridor corridor)
 {
     cCorridorExit corExit = corridor.exitList[Random.Range(0,corridor.exitList.Count-1)];
     int corridorLength = Random.Range(_corridorMinLength, _corridorMaxLength);
     if (!CheckCorridorSpace(
         corExit.X + corExit.deltaX,
         corExit.Z + corExit.deltaZ,
         corExit.deltaX,
         corExit.deltaZ,
         corridorLength
     )) {
         return false;
     }
     currentMapElemId++;
     currentCorridor = new cCorridor (
         currentMapElemId,
         corExit.X + corExit.deltaX,
         corExit.Z + corExit.deltaZ,
         corExit.deltaX,
         corExit.deltaZ,
         corridorLength
     );
     _mapInfo [corExit.X, corExit.Z] = corridor.id;//remove wall
     UpdateMapInfo (currentCorridor);
     corridorList.Add (currentCorridor);
     corridor.exitList.Remove (corExit);
     return true;
 }