protected void BuildStairsOffRoom(int buildDirection, int originX, int originY)
    {
        map.BulkEditBegin();

        var depth = Rand.Range(12, 20);
        var y     = 0;

        for (int i = 0; i < depth; i++)
        {
            // while coordinates are within the map's bounds
            if (TileInBounds(originX, originY + y))
            {
                for (int x = 0; x < y; x++)
                {
                    switch (buildDirection)
                    {
                    case RIGHT:
                    {
                        if (TileInBounds(originX + x, originY + y))
                        {
                            // build stairs
                            if (map.GetTileInfo(originX, originY + y) != null)
                            {
                                stoneBrush.PaintTile(map, originX + x, originY + y);
                            }

                            // erase walls to the right of stairs
                            map.ClearTile(originX + x + 1, originY + y);
                            map.ClearTile(originX + x + 2, originY + y);
                            map.ClearTile(originX + x + 3, originY + y);
                            map.ClearTile(originX + x + 4, originY + y);
                        }

                        break;
                    }

                    case LEFT:
                    {
                        if (TileInBounds(originX - x, originY + y))
                        {
                            // build stairs
                            if (map.GetTileInfo(originX, originY + y) != null)
                            {
                                stoneBrush.PaintTile(map, originX - x, originY + y);
                            }

                            // erase walls to the left of stairs
                            map.ClearTile(originX - x - 1, originY + y);
                            map.ClearTile(originX - x - 2, originY + y);
                            map.ClearTile(originX - x - 3, originY + y);
                            map.ClearTile(originX - x - 4, originY + y);
                        }

                        break;
                    }
                    }
                }

                y++;
            }
        }

        map.BulkEditEnd();
    }
    void CarveHalls()
    {
        map.BulkEditBegin();

        int originX;
        int originY;
        int x;

        foreach (ProcRoom room in rooms)
        {
            var hall = new ProcHall();

            // get random direction
            int rand = Rand.Range(0, 1);
            direction = (rand == 0 ? RIGHT : LEFT);

            // set origin point
            if (direction == RIGHT)
            {
                originX = room.BottomRightX();
                originY = room.BottomRightY();
                x       = 1;
            }
            else
            {
                originX = room.BottomLeftX();
                originY = room.BottomLeftY();
                x       = -1;
            }

            // get random height to make halls either two or four tiles tall
            int rand2 = Rand.Range(0, 10);
            int i     = (rand2 == 0 ? 2 : 4);

            while (map.GetTileInfo(originX + x, originY) != null &&
                   TileInBounds(originX + x, originY))
            {
                if (i == 2)
                {
                    map.ClearTile(originX + x, originY);
                    map.ClearTile(originX + x, originY - 1);
                }
                else
                {
                    map.ClearTile(originX + x, originY);
                    map.ClearTile(originX + x, originY - 1);
                    map.ClearTile(originX + x, originY - 2);
                    map.ClearTile(originX + x, originY - 3);
                }

                x = (direction == RIGHT ? x + 1 : x - 1);
            }

            // with hall succesfully placed, set its origin, width, and height, then add to List
            hall.width   = Math.Abs(x) - 1;
            hall.height  = i;
            hall.originY = originY - (i - 1);
            hall.originX = (direction == RIGHT ? originX + 1 : originX - hall.width);

            halls.Add(hall);
        }

        map.BulkEditEnd();
    }