public GameObject GenerateLevel()
    {
        var level_obj = new GameObject("Level");
        var empty     = new bool[25];

        Array.Clear(empty, 0, empty.Length);
        var hole_count = HoleCountProbabilityMap[m_rand.Next(HoleCountProbabilityMap.Length)];

        for (var i = 0; i < hole_count; ++i)
        {
            var hole_start = HolePositionProbabilityMap[m_rand.Next(HolePositionProbabilityMap.Length)];
            var hole_size  = HoleSizeProbabilityMap[m_rand.Next(HoleSizeProbabilityMap.Length)];
            for (var j = 0; j < hole_size; ++j)
            {
                empty[hole_start * 5 + j] = true;
            }
        }

        bool generateItem = false;

        if (--m_levelsBeforeItemGeneration == 0)
        {
            generateItem = true;
            m_levelsBeforeItemGeneration = m_rand.Next(3, 6);
        }
        var generateItemCount = m_rand.Next(2, 4);
        var itemCd            = m_rand.Next(4, 8);

        for (var i = 0; i < 25; ++i)
        {
            if (empty[i])
            {
                continue;
            }
            var gm = m_blockPool.Claim();
            gm.transform.SetParent(level_obj.transform);
            gm.transform.localPosition += new Vector3Int(i, 0, 0);
            if (generateItem && (--itemCd == 0) && (generateItemCount--) > 0)
            {
                var items = FallingDownSession.Instance.ItemList;
                if (items.Length != 0)
                {
                    var item = GameObject.Instantiate(items[m_rand.Next(items.Length)], Vector3.zero, Quaternion.identity);
                    item.transform.SetParent(level_obj.transform, false);
                    item.transform.localPosition += new Vector3(i, 1.2f, 0);
                }
                itemCd = m_rand.Next(6, 10);
            }
            //gm.AddComponent<ShatteredBlockBehaviour>();
        }
        RecycleLevels();
        m_levelQueue.Enqueue(level_obj);
        return(level_obj);
    }