public enum BlockType
{
    Empty,
    Basic,
    Execute,
    MegaBlock
}

public struct Block
{
    public readonly BlockType BlockType;
    public int ColorIndex;
    public Vector2Int BlockSize;

    public Block(BlockType blockType)
    {
        BlockType = blockType;
        ColorIndex = -1;
        BlockSize = Vector2Int.one;
    }

    public Block(BlockType blockType, int colorIndex)
    {
        BlockType = blockType;
        ColorIndex = colorIndex;
        if (blockType == BlockType.MegaBlock)
        {
            BlockSize = Vector2Int.one * 2;
        }
        else
        {
            BlockSize = Vector2Int.one;
        }
    }
}

public struct Board
{
    public NativeArray<Block> BlockArray;
    public Vector2Int BoardSize;
    public int Score;

    public Board(Vector2Int boardSize)
    {
        BoardSize = boardSize;
        BlockArray = new NativeArray<Block>(BoardSize.x * BoardSize.y, Allocator.Persistent);
        Score = 0;
    }

    public Board(Board boardToCopy, Allocator allocator)
    {
        BoardSize = boardToCopy.BoardSize;
        BlockArray = new NativeArray<Block>(boardToCopy.BlockArray, allocator);
        Score = boardToCopy.Score;
    }
}