void MarkRoomOnMatrix(RoomStruct _room)
 {
     for (int i = _room.x - (_room.heigth - 1) / 2; i <= _room.x + _room.heigth / 2; ++i)
     {
         for (int j = _room.y - (_room.width - 1) / 2; j <= _room.y + _room.width / 2; ++j)
         {
             m_MapMatrix[i, j] = STRUCTURE_TYPE.Tile;
         }
     }
 }
 void MarkShop(RoomStruct _shop)
 {
     for (int i = _shop.x - 4; i <= _shop.x + 4; ++i)
     {
         for (int j = _shop.y - 3; j <= _shop.y + 3; ++j)
         {
             m_MapMatrix[i, j] = STRUCTURE_TYPE.Tile;
             if (i == _shop.x - 4 || i == _shop.x + 4 || j == _shop.y - 3 || j == _shop.y + 3)
             {
                 m_MapMatrix[i, j] = STRUCTURE_TYPE.ShopWall;
             }
         }
     }
 }
    void MakePath(RoomStruct _first, RoomStruct _second)
    {
        int direction = _first.y - _second.y > 0 ? -1 : 1;

        for (int i = _first.y; i != _second.y + direction; i = i + direction)
        {
            m_MapMatrix[_first.x, i] = STRUCTURE_TYPE.Tile;
        }
        direction = _first.x - _second.x > 0 ? -1 : 1;
        for (int i = _first.x; i != _second.x + direction; i = i + direction)
        {
            m_MapMatrix[i, _second.y] = STRUCTURE_TYPE.Tile;
        }
    }
    public void GenerateRooms()
    {
        List <RoomStruct> first_line  = new List <RoomStruct>();
        List <RoomStruct> second_line = new List <RoomStruct>();
        List <RoomStruct> third_line  = new List <RoomStruct>();

        first_line.Add(new RoomStruct());
        second_line.Add(new RoomStruct());
        third_line.Add(new RoomStruct());
        int numOfRooms = Random.Range(5, 7);

        for (int i = 4; i <= numOfRooms; ++i)
        {
            int assignedRow = Random.Range(1, 4);
            switch (assignedRow)
            {
            case 1:
                first_line.Add(new RoomStruct());
                break;

            case 2:
                second_line.Add(new RoomStruct());
                break;

            case 3:
                third_line.Add(new RoomStruct());
                break;

            default:
                Debug.LogWarning("Something went very wrong!");
                break;
            }
        }
        KeyValuePair <int, int> first_second_link = new KeyValuePair <int, int>(Random.Range(0, first_line.Count), Random.Range(0, second_line.Count));
        KeyValuePair <int, int> second_third_link = new KeyValuePair <int, int>(Random.Range(0, second_line.Count), Random.Range(0, third_line.Count));

        first_line[0].x = 40;
        first_line[0].y = 50;
        MarkRoomOnMatrix(first_line[0]);
        for (int i = 1; i < first_line.Count; ++i)
        {
            first_line[i].x = first_line[0].x + Random.Range(-3, 4);
            first_line[i].y = first_line[i - 1].y + Random.Range(6, 10);
            MarkRoomOnMatrix(first_line[i]);
            MakePath(first_line[i - 1], first_line[i]);
        }
        GenerateRow(ref first_line, ref second_line, first_second_link);
        GenerateRow(ref second_line, ref third_line, second_third_link);
        bool isNeighborUp              = Random.Range(1, 3) == 1 ? true : false;
        List <RoomStruct> room_list    = isNeighborUp == true ? first_line : third_line;
        RoomStruct        shopNeighbor = room_list[Random.Range(0, room_list.Count)];
        RoomStruct        shop         = new RoomStruct();

        shop.y = shopNeighbor.y;
        shop.x = shopNeighbor.x + (isNeighborUp == true ? 7 : -7);
        MarkShop(shop);
        MakePath(shop, shopNeighbor);
        foreach (RoomStruct room in first_line)
        {
            m_RoomsList.Add(room);
        }
        foreach (RoomStruct room in second_line)
        {
            m_RoomsList.Add(room);
        }
        foreach (RoomStruct room in third_line)
        {
            m_RoomsList.Add(room);
        }
        TrimMap();
    }