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); }