public project_data_desc()
        {
            m_ver      = 0;
            m_file_ext = null;

            m_scr_blocks_width  = 0xff;
            m_scr_blocks_height = 0xff;

            m_scr_align                  = data_conversion_options_form.EScreensAlignMode.sam_MidCenter;
            m_convert_colors             = true;
            m_use_file_screen_resolution = false;

            m_scr_data_tiles4x4 = true;
        }
        protected void load_screens(BinaryReader _br,
                                    byte _ver,
                                    data_sets_manager.EScreenDataType _scr_type,
                                    data_conversion_options_form.EScreensAlignMode _scr_align_mode,
                                    int _prj_scr_tiles_width,
                                    int _prj_scr_tiles_height,
                                    tiles_data _data)
        {
            screen_data scr;

            int tile_x;
            int tile_y;
            int tile_y_offset;

            int scr_data_len            = platform_data.get_screen_tiles_cnt_uni(_scr_type);
            int native_scr_tiles_width  = platform_data.get_screen_tiles_width_uni(_scr_type);
            int native_scr_tiles_height = platform_data.get_screen_tiles_height_uni(_scr_type);

            m_native_scr_rect.X      = 0;
            m_native_scr_rect.Y      = 0;
            m_native_scr_rect.Width  = native_scr_tiles_width;
            m_native_scr_rect.Height = native_scr_tiles_height;

            m_prj_scr_rect.X      = 0;
            m_prj_scr_rect.Y      = 0;
            m_prj_scr_rect.Width  = _prj_scr_tiles_width;
            m_prj_scr_rect.Height = _prj_scr_tiles_height;

            // calc aligned prj screen pos
            {
                int scr_align_data = ( int )_scr_align_mode;

                if ((scr_align_data & data_conversion_options_form.CONST_ALIGN_X_MID) != 0)
                {
                    m_prj_scr_rect.X = (m_native_scr_rect.Width >> 1) - (_prj_scr_tiles_width >> 1);
                }
                else
                if ((scr_align_data & data_conversion_options_form.CONST_ALIGN_X_RIGHT) != 0)
                {
                    m_prj_scr_rect.X = m_native_scr_rect.Width - m_prj_scr_rect.Width;
                }

                if ((scr_align_data & data_conversion_options_form.CONST_ALIGN_Y_MID) != 0)
                {
                    m_prj_scr_rect.Y = (m_native_scr_rect.Height >> 1) - (_prj_scr_tiles_height >> 1);
                }
                else
                if ((scr_align_data & data_conversion_options_form.CONST_ALIGN_Y_BOTTOM) != 0)
                {
                    m_prj_scr_rect.Y = m_native_scr_rect.Height - m_prj_scr_rect.Height;
                }
            }

            bool native_scr_data = ((native_scr_tiles_width == _prj_scr_tiles_width) && (native_scr_tiles_height == _prj_scr_tiles_height));

            int scr_cnt = _br.ReadInt32();

            Action <int> skip_tiles = tiles_cnt => { if (_ver < 5)
                                                     {
                                                         _br.ReadBytes(tiles_cnt);
                                                     }
                                                     else
                                                     {
                                                         _br.ReadBytes(tiles_cnt << 1);
                                                     } };

            for (int i = 0; i < scr_cnt; i++)
            {
                scr = _data.create_screen(_scr_type);

                if (native_scr_data)
                {
                    scr.load(_br, _ver, scr_data_len, -1);
                }
                else
                {
                    for (tile_y = m_prj_scr_rect.Y; tile_y < (m_prj_scr_rect.Y + m_prj_scr_rect.Height); tile_y++)
                    {
                        if (tile_y < 0 || tile_y >= native_scr_tiles_height)
                        {
                            skip_tiles(_prj_scr_tiles_width);
                            continue;
                        }

                        tile_y_offset = native_scr_tiles_width * tile_y;

                        for (tile_x = m_prj_scr_rect.X; tile_x < (m_prj_scr_rect.X + m_prj_scr_rect.Width); tile_x++)
                        {
                            if (tile_x < 0 || tile_x >= native_scr_tiles_width)
                            {
                                skip_tiles(1);
                            }
                            else
                            {
                                scr.load(_br, _ver, 1, tile_y_offset + tile_x);
                            }
                        }
                    }
                }
            }

            validate_screens(_scr_type, _data);
        }