int CreatePassage(MAP.Vector2D doorPos, MAP.DIRECTION direction)
    {
        int dir   = 0;
        int coord = 0;

        MAP.SPACE curSpace;
        if (direction == MAP.DIRECTION.UP || direction == MAP.DIRECTION.DOWN)
        {
            dir = direction == MAP.DIRECTION.UP ? -1 : 1;
            while (true)
            {
                ++coord;
                curSpace = Map[doorPos.y + (coord * dir)][doorPos.x];

                Map[doorPos.y + (coord * dir)][doorPos.x - 1] = Map[doorPos.y + (coord * dir)][doorPos.x - 1] | MAP.SPACE.PASSAGE_WALL;
                Map[doorPos.y + (coord * dir)][doorPos.x]     = Map[doorPos.y + (coord * dir)][doorPos.x] | MAP.SPACE.PASSAGE_FLOOR;
                Map[doorPos.y + (coord * dir)][doorPos.x + 1] = Map[doorPos.y + (coord * dir)][doorPos.x + 1] | MAP.SPACE.PASSAGE_WALL;

                if ((curSpace & MAP.SPACE.BLOCK) == MAP.SPACE.BLOCK)
                {
                    break;
                }

                if ((curSpace & MAP.SPACE.PASSAGE_WALL) == MAP.SPACE.PASSAGE_WALL)
                {
                    Map[doorPos.y + (coord * dir)][doorPos.x] = MAP.SPACE.PASSAGE_FLOOR;
                    ++coord;
                    break;
                }
            }
            coord = doorPos.y + (coord * dir);
        }
        else
        {
            dir = direction == MAP.DIRECTION.RIGHT ? -1 : 1;
            while (true)
            {
                ++coord;
                curSpace = Map[doorPos.y][doorPos.x + (coord * dir)];

                Map[doorPos.y - 1][doorPos.x + (coord * dir)] = Map[doorPos.y - 1][doorPos.x + (coord * dir)] | MAP.SPACE.PASSAGE_WALL;
                Map[doorPos.y][doorPos.x + (coord * dir)]     = Map[doorPos.y][doorPos.x + (coord * dir)] | MAP.SPACE.PASSAGE_FLOOR;
                Map[doorPos.y + 1][doorPos.x + (coord * dir)] = Map[doorPos.y + 1][doorPos.x + (coord * dir)] | MAP.SPACE.PASSAGE_WALL;

                if ((curSpace & MAP.SPACE.BLOCK) == MAP.SPACE.BLOCK)
                {
                    break;
                }

                if ((curSpace & MAP.SPACE.PASSAGE_WALL) == MAP.SPACE.PASSAGE_WALL)
                {
                    Map[doorPos.y][doorPos.x + (coord * dir)] = MAP.SPACE.PASSAGE_FLOOR;
                    ++coord;
                    break;
                }
            }
            coord = doorPos.x + (coord * dir);
        }
        return(coord);
    }
    void ConnectRoom(MAP.ROOM lRoom, MAP.ROOM rRoom, MAP.DIRECTION lDir, MAP.DIRECTION rDir)
    {
        bool createLDoor = lRoom.CreateDoor(lDir);
        bool createRDoor = rRoom.CreateDoor(rDir);

        MAP.Vector2D lDoor = lRoom.GetDoorPosition(lDir);
        MAP.Vector2D rDoor = rRoom.GetDoorPosition(rDir);
        Map[lDoor.y][lDoor.x] = MAP.SPACE.ROOM_DOOR;
        Map[rDoor.y][rDoor.x] = MAP.SPACE.ROOM_DOOR;

        //직선인 경우
        if (lDoor.y == rDoor.y)
        {
            int x = 1;
            do
            {
                Map[lDoor.y - 1][lDoor.x + x] = Map[lDoor.y - 1][lDoor.x + x] | MAP.SPACE.PASSAGE_WALL;
                Map[lDoor.y][lDoor.x + x]     = Map[lDoor.y][lDoor.x + x] | MAP.SPACE.PASSAGE_FLOOR;
                Map[lDoor.y + 1][lDoor.x + x] = Map[lDoor.y + 1][lDoor.x + x] | MAP.SPACE.PASSAGE_WALL;
                ++x;
            } while (lDoor.x + x != rDoor.x);
        }

        else if (lDoor.x == rDoor.x)
        {
            int y = 1;
            do
            {
                Map[lDoor.y + y][lDoor.x - 1] = Map[lDoor.y + y][lDoor.x - 1] | MAP.SPACE.PASSAGE_WALL;
                Map[lDoor.y + y][lDoor.x]     = Map[lDoor.y + y][lDoor.x] | MAP.SPACE.PASSAGE_FLOOR;
                Map[lDoor.y + y][lDoor.x + 1] = Map[lDoor.y + y][lDoor.x + 1] | MAP.SPACE.PASSAGE_WALL;
                ++y;
            } while (lDoor.y + y != rDoor.y);
        }
        //직선이 아닌 경우
        else
        {
            int pos = 0;
            if (createLDoor)
            {
                pos = CreatePassage(lDoor, lDir);
            }
            if (createRDoor)
            {
                pos = CreatePassage(rDoor, rDir);
            }

            ConnectPassage(pos, lDoor, rDoor, lDir);
        }
    }
    public void GeneratePassage(NODE lNode, NODE rNODE, MAP.DIVIDE divideDir)
    {
        MAP.DIRECTION lDir = MAP.DIRECTION.NONE;
        MAP.DIRECTION rDir = MAP.DIRECTION.NONE;

        switch (divideDir)
        {
        case MAP.DIVIDE.VERTICAL:
            lDir = MAP.DIRECTION.LEFT;
            rDir = MAP.DIRECTION.RIGHT;
            break;

        case MAP.DIVIDE.HORIZONTAL:
            lDir = MAP.DIRECTION.DOWN;
            rDir = MAP.DIRECTION.UP;
            break;
        }

        if (lDir != MAP.DIRECTION.NONE)
        {
            //Debug.Log(lDir + " , " + rDir);
            ConnectRoom(lNode.roomInfo, rNODE.roomInfo, lDir, rDir);
        }
    }
    void ConnectPassage(int pos, MAP.Vector2D lDoor, MAP.Vector2D rDoor, MAP.DIRECTION lDir)
    {
        int coord = 0;
        int small = 0;
        int large = 0;

        //왼쪽 문 방향이 아래 = 횡으로  연결
        if (lDir == MAP.DIRECTION.DOWN)
        {
            small = lDoor.x < rDoor.x ? lDoor.x : rDoor.x;
            large = lDoor.x > rDoor.x ? lDoor.x : rDoor.x;

            if ((Map[pos - 1][small + coord] & MAP.SPACE.PASSAGE_FLOOR) != MAP.SPACE.PASSAGE_FLOOR)
            {
                Map[pos - 1][small + coord] = MAP.SPACE.PASSAGE_WALL;
            }

            if ((Map[pos + 1][small + coord] & MAP.SPACE.PASSAGE_FLOOR) != MAP.SPACE.PASSAGE_FLOOR)
            {
                Map[pos + 1][small + coord] = MAP.SPACE.PASSAGE_WALL;
            }

            Map[pos][small + coord] = Map[pos][small + coord] | MAP.SPACE.PASSAGE_FLOOR;
            ++coord;

            while (true)
            {
                if (small + coord == large)
                {
                    if ((Map[pos - 1][small + coord] & MAP.SPACE.PASSAGE_FLOOR) != MAP.SPACE.PASSAGE_FLOOR)
                    {
                        Map[pos - 1][small + coord] = (Map[pos - 1][small + coord] | MAP.SPACE.PASSAGE_WALL);
                    }

                    if ((Map[pos + 1][small + coord] & MAP.SPACE.PASSAGE_FLOOR) != MAP.SPACE.PASSAGE_FLOOR)
                    {
                        Map[pos + 1][small + coord] = (Map[pos + 1][small + coord] | MAP.SPACE.PASSAGE_WALL);
                    }

                    Map[pos][small + coord] = Map[pos][small + coord] | MAP.SPACE.PASSAGE_FLOOR;
                    break;
                }

                Map[pos - 1][small + coord] = Map[pos - 1][small + coord] | MAP.SPACE.PASSAGE_WALL;
                Map[pos][small + coord]     = Map[pos][small + coord] | MAP.SPACE.PASSAGE_FLOOR;
                Map[pos + 1][small + coord] = Map[pos + 1][small + coord] | MAP.SPACE.PASSAGE_WALL;
                ++coord;
            }
        }
        else
        {
            small = lDoor.y < rDoor.y ? lDoor.y : rDoor.y;
            large = lDoor.y > rDoor.y ? lDoor.y : rDoor.y;

            if ((Map[small + coord][pos - 1] & MAP.SPACE.PASSAGE_FLOOR) != MAP.SPACE.PASSAGE_FLOOR)
            {
                Map[small + coord][pos - 1] = Map[small + coord][pos - 1] | MAP.SPACE.PASSAGE_WALL;
            }

            if ((Map[small + coord][pos + 1] & MAP.SPACE.PASSAGE_FLOOR) != MAP.SPACE.PASSAGE_FLOOR)
            {
                Map[small + coord][pos + 1] = Map[small + coord][pos + 1] | MAP.SPACE.PASSAGE_WALL;
            }

            Map[small + coord][pos] = Map[small + coord][pos] | MAP.SPACE.PASSAGE_FLOOR;
            ++coord;

            while (true)
            {
                if (small + coord == large)
                {
                    if ((Map[small + coord][pos - 1] & MAP.SPACE.PASSAGE_FLOOR) != MAP.SPACE.PASSAGE_FLOOR)
                    {
                        Map[small + coord][pos - 1] = Map[small + coord][pos - 1] | MAP.SPACE.PASSAGE_WALL;
                    }

                    if ((Map[small + coord][pos + 1] & MAP.SPACE.PASSAGE_FLOOR) != MAP.SPACE.PASSAGE_FLOOR)
                    {
                        Map[small + coord][pos + 1] = Map[small + coord][pos + 1] | MAP.SPACE.PASSAGE_WALL;
                    }

                    Map[small + coord][pos] = Map[small + coord][pos] | MAP.SPACE.PASSAGE_FLOOR;
                    break;
                }

                Map[small + coord][pos - 1] = Map[small + coord][pos - 1] | MAP.SPACE.PASSAGE_WALL;
                Map[small + coord][pos]     = Map[small + coord][pos] | MAP.SPACE.PASSAGE_FLOOR;
                Map[small + coord][pos + 1] = Map[small + coord][pos + 1] | MAP.SPACE.PASSAGE_WALL;
                ++coord;
            }
        }
    }