示例#1
0
        int CHRs_optimization(tiles_data _data, bool _check)
        {
            int deleted_CHRs_cnt = 0;

            int CHR_data_sum;

            byte[] img_buff = new byte[utils.CONST_SPR8x8_TOTAL_PIXELS_CNT];

            int size_offs;
            int size = _data.get_first_free_spr8x8_id(false);

            for (int CHR_n = 0; CHR_n < size; CHR_n++)
            {
                if (check_blocks_CHR(CHR_n, _data) == false)
                {
                    CHR_data_sum = _data.spr8x8_sum(CHR_n);

                    if (CHR_data_sum != 0)
                    {
                        ++deleted_CHRs_cnt;
                    }

                    if (_check == true)
                    {
                        continue;
                    }

                    // delete useless CHR
                    {
                        size_offs = platform_data.get_CHR_bank_max_sprites_cnt() - 1;

                        for (int i = CHR_n; i < size_offs; i++)
                        {
                            _data.from_CHR_bank_to_spr8x8(i + 1, img_buff, 0);
                            _data.from_spr8x8_to_CHR_bank(i, img_buff);
                        }
                    }

                    // the last CHR is an empty space
                    {
#if DEF_ZX
                        for (int i = 0; i < img_buff.Length; i++)
                        {
                            img_buff[i] = utils.CONST_ZX_DEFAULT_PAPER_COLOR;
                        }
#else
                        Array.Clear(img_buff, 0, utils.CONST_SPR8x8_TOTAL_PIXELS_CNT);
#endif
                        _data.from_spr8x8_to_CHR_bank(platform_data.get_CHR_bank_max_sprites_cnt() - 1, img_buff);
                    }

                    shift_CHRs_data(CHR_n, _data);

                    --CHR_n;
                    --size;
                }
            }

            return(deleted_CHRs_cnt);
        }
        private void validate_screens(data_sets_manager.EScreenDataType _scr_type,
                                      tiles_data _data)
        {
            int         scr_n;
            int         tile_n;
            ushort      tile_val;
            screen_data scr;

            int blocks_cnt = _data.blocks.Length >> 2;

            for (scr_n = 0; scr_n < _data.screen_data_cnt(); scr_n++)
            {
                scr = _data.get_screen_data(scr_n);

                for (tile_n = 0; tile_n < scr.m_arr.Length; tile_n++)
                {
                    tile_val = scr.m_arr[tile_n];

                    if (_scr_type == data_sets_manager.EScreenDataType.sdt_Tiles4x4)
                    {
                        if (tile_val >= _data.tiles.Length)
                        {
                            scr.m_arr[tile_n] = 0;
                        }
                    }
                    else
                    {
                        if (tile_val >= blocks_cnt)
                        {
                            scr.m_arr[tile_n] = 0;
                        }
                    }
                }
            }
        }
        public uint convert_block_data(byte _ver, platform_data.EPlatformType _prj_platform, int _ind, uint _data)
        {
            tiles_data inner_data = get_last_tiles_data();

            if (_ver <= 2 && _prj_platform == platform_data.EPlatformType.pt_SMS)
            {
                // OLD SMS: [ property_id ](4) [ CHR bank ](2) [ hv_flip ](2) [CHR ind](8)
                // NEW SMS: [ property_id ](4) [ hv_flip ](2) [ palette ind ](1) [CHR ind](9)
                // 11-12 (CHR bank) <-> 9-10 (hv_flip)
                _data = (_data & 0xfffff0ff) | (((_data & 0x00000300) << 2) | ((_data & 0x00000c00) >> 2));
            }

            if (m_dict_CHR_palette_ind != null)
            {
                int CHR_id      = m_map_data_app_src.unpack_data(map_data_config_base.EData.ed_CHR_id, _data);
                int palette_ind = m_map_data_app_src.unpack_data(map_data_config_base.EData.ed_Palette, _data);

                if (!m_dict_CHR_palette_ind.ContainsKey(CHR_id))
                {
                    m_dict_CHR_palette_ind.Add(CHR_id, palette_ind);
                }

                // reset palette index
                _data = m_map_data_app_src.pack_data(map_data_config_base.EData.ed_Palette, 0, _data);

                inner_data.blocks[_ind] = _data;
            }
            else
            {
                inner_data.blocks[_ind] = _data;
            }

            return(m_map_data_app_dst.repack(m_map_data_app_src, _data));
        }
        public void update_blocks(utils.ETileViewType _view_type, tiles_data _tiles_data, bool _prop_per_block, data_sets_manager.EScreenDataType _scr_type)
        {
            Image    img;
            Graphics gfx;

            m_block_rect.Width = m_block_rect.Height = (_view_type == utils.ETileViewType.tvt_ObjectId && !_prop_per_block) ? (utils.CONST_BLOCKS_IMG_SIZE >> 1):utils.CONST_BLOCKS_IMG_SIZE;

            for (int i = 0; i < platform_data.get_max_blocks_cnt(); i++)
            {
                img = m_imagelist_blocks.Images[i];

                gfx = Graphics.FromImage(img);

                if (_tiles_data != null)
                {
                    update_block(i, _view_type, _tiles_data, _prop_per_block, gfx, img, _scr_type);
                }
                else
                {
                    gfx.Clear(utils.CONST_COLOR_BLOCK_CLEAR);
                }

                m_imagelist_blocks.Images[i] = img;

                gfx.Dispose();
            }

            m_panel_blocks.Refresh();
        }
        public void pre_load_block_data(platform_data.EPlatformType _prj_platform)
        {
            if (_prj_platform == platform_data.EPlatformType.pt_NES && platform_data.get_platform_type() != platform_data.EPlatformType.pt_NES)
            {
                m_dict_CHR_palette_ind = new Dictionary <int, int>(platform_data.get_max_blocks_UINT_cnt());
            }

            m_map_data_app_src = map_data_config_provider.config_app(_prj_platform);
            m_map_data_app_dst = map_data_config_provider.config_app(platform_data.get_platform_type());

            if (m_inner_tiles_data == null)
            {
                m_inner_tiles_data = new List <tiles_data>(16);
            }

            tiles_data inner_tiles_data = new tiles_data(true);

            inner_tiles_data.palettes_arr.Clear();

            m_inner_tiles_data.Add(inner_tiles_data);

            if (m_palettes != null)
            {
                inner_tiles_data.palettes_arr.AddRange(m_palettes);

                m_palettes.Clear();
                m_palettes = null;
            }
        }
示例#6
0
        private void update_bank_GFX()
        {
            tiles_data data = m_data_manager.get_tiles_data(ListBoxCHRBanks.SelectedIndex);

            int img_size      = utils.CONST_BLOCKS_IMG_SIZE;
            int half_img_size = img_size >> 1;
            int side          = 5;
            int size          = side * side;

            Bitmap   bmp = new Bitmap(img_size, img_size);
            Graphics gfx = Graphics.FromImage(bmp);

            gfx.SmoothingMode     = SmoothingMode.HighSpeed;
            gfx.InterpolationMode = InterpolationMode.NearestNeighbor;
//			gfx.PixelOffsetMode		= PixelOffsetMode.HighQuality;

            for (int i = 0; i < size; i++)
            {
                utils.update_block_gfx(i, data, gfx, half_img_size, half_img_size, 0, 0, 0);

                m_blocks_preview.update(bmp, img_size, img_size, (i % side) * img_size, (i / side) * img_size, i == (size - 1), i == 0);
            }

            gfx.Dispose();
            bmp.Dispose();

            // update info
            {
                LabelCHRs.Text      = data.get_first_free_spr8x8_id(false).ToString();
                LabelBlocks2x2.Text = data.get_first_free_block_id(false).ToString();
                LabelTiles4x4.Text  = data.get_first_free_tile_id(false).ToString();
                LabelScreens.Text   = data.screen_data_cnt().ToString();
                LabelPalettes.Text  = data.palettes_arr.Count.ToString();
            }
        }
示例#7
0
        public void set_selected_tile(int _tile_id, tiles_data _data)
        {
            if (_data != null)
            {
                m_selected_tile_id = _tile_id;

                m_tiles_data = _data;

                m_selected_quad_ind = 0;

                update_status_bar();

                if (m_locked == false && (UpdateSelectedBlock != null))
                {
                    UpdateSelectedBlock(this, new EventArg2Params(m_tiles_data.get_tile_block(m_selected_tile_id, m_selected_quad_ind), m_tiles_data));
                }
            }
            else
            {
                m_selected_tile_id = -1;

                m_tiles_data = null;
            }

            update();
        }
示例#8
0
        int Screens_optimization(tiles_data _data, bool _check)
        {
            int deleted_screens_cnt = 0;

            int bank_id = Convert.ToInt32(_data.name);

            int size = _data.screen_data_cnt();

            for (int scr_n = 0; scr_n < size; scr_n++)
            {
                if (check_layouts_screen(scr_n, _data) == false)
                {
                    ++deleted_screens_cnt;

                    if (_check == true)
                    {
                        continue;
                    }

                    _data.delete_screen(scr_n);

                    m_data_sets.remove_screen_from_layouts(bank_id, scr_n);

                    --scr_n;
                    --size;
                }
            }

            return(deleted_screens_cnt);
        }
        public void update_tiles(utils.ETileViewType _view_type, tiles_data _tiles_data, data_sets_manager.EScreenDataType _scr_type)
        {
            Image    img;
            Graphics gfx;

            if (_scr_type == data_sets_manager.EScreenDataType.sdt_Tiles4x4)
            {
                for (int i = 0; i < platform_data.get_max_tiles_cnt(); i++)
                {
                    img = m_imagelist_tiles.Images[i];

                    gfx = Graphics.FromImage(img);

                    if (_tiles_data != null)
                    {
                        update_tile(i, _view_type, _tiles_data, gfx, img, _scr_type);
                    }
                    else
                    {
                        gfx.Clear(utils.CONST_COLOR_TILE_CLEAR);
                    }

                    m_imagelist_tiles.Images[i] = img;

                    gfx.Dispose();
                }

                m_panel_tiles.Refresh();
            }
        }
示例#10
0
        private void new_data_set(object sender, EventArgs e)
        {
            data_sets_manager data_mngr = sender as data_sets_manager;

            tiles_data data = data_mngr.get_tiles_data(data_mngr.tiles_data_pos);

            m_data = data;

            m_sel_ind        = -1;
            m_sel_block_CHRs = 0;

            m_active_page = 0;

            if (m_data != null)
            {
                if (platform_data.get_CHR_bank_pages_cnt() > 1)
                {
                    update_active_page_text();
                }
            }
            else
            {
                m_CHR_bank_grp_box.Text = "CHR Bank:";
            }

            update();
        }
示例#11
0
        public void set_selected_block(int _block_id, tiles_data _data)
        {
            if (_data != null)
            {
                m_sel_block_id = _block_id;

                m_data = _data;

                m_sel_quad_ind = 0;

                dispatch_event_data_changed();

                update_status_bar();
            }
            else
            {
                m_sel_block_id = -1;

                m_data = null;
            }

            set_active_palette();

            dispatch_event_quad_selected();

            update();
        }
示例#12
0
        bool check_tiles_block(int _block_id, tiles_data _data)
        {
            if (m_data_sets.screen_data_type == data_sets_manager.EScreenDataType.sdt_Tiles4x4)
            {
                int tile_n;
                int i;

                int _block_id_offset = _block_id << 2;
                int block_n_offset;

                // check duplicate(s)
                for (int block_n = 0; block_n < _block_id; block_n++)
                {
                    block_n_offset = block_n << 2;

                    for (i = 0; i < utils.CONST_BLOCK_SIZE; i++)
                    {
                        if (_data.blocks[block_n_offset + i] != _data.blocks[_block_id_offset + i])
                        {
                            break;
                        }
                    }

                    if (i == utils.CONST_BLOCK_SIZE)
                    {
                        // duplicate found
                        for (tile_n = 0; tile_n < platform_data.get_max_tiles_cnt(); tile_n++)
                        {
                            for (i = 0; i < utils.CONST_TILE_SIZE; i++)
                            {
                                if (_block_id == _data.get_tile_block(tile_n, i))
                                {
                                    // replace _block_id with block_n
                                    _data.set_tile_block(tile_n, i, ( ushort )block_n);
                                }
                            }
                        }
                    }
                }

                for (tile_n = 0; tile_n < platform_data.get_max_tiles_cnt(); tile_n++)
                {
                    for (i = 0; i < utils.CONST_TILE_SIZE; i++)
                    {
                        if (_block_id == _data.get_tile_block(tile_n, i))
                        {
                            return(true);
                        }
                    }
                }
            }
            else
            {
                return(check_screens_block(_block_id, _data));
            }

            return(false);
        }
示例#13
0
        private void update_block(object sender, EventArgs e)
        {
            EventArg2Params args = (e as EventArg2Params);

            int        block_id = Convert.ToInt32(args.param1);
            tiles_data data     = args.param2 as tiles_data;

            set_selected_block(block_id, data);
        }
        public virtual void load_screens(BinaryReader _br,
                                         project_data_desc _prj_data,
                                         data_sets_manager.EScreenDataType _scr_type,
                                         tiles_data _data)
        {
            int prj_scr_tiles_width  = (_prj_data.m_scr_blocks_width == 0xff) ? platform_data.get_screen_tiles_width_by_file_ext_uni(_prj_data.m_file_ext, _scr_type, true):(_scr_type == data_sets_manager.EScreenDataType.sdt_Tiles4x4 ? ((_prj_data.m_scr_blocks_width + 1) >> 1):_prj_data.m_scr_blocks_width);
            int prj_scr_tiles_height = (_prj_data.m_scr_blocks_height == 0xff) ? platform_data.get_screen_tiles_height_by_file_ext_uni(_prj_data.m_file_ext, _scr_type, true):(_scr_type == data_sets_manager.EScreenDataType.sdt_Tiles4x4 ? ((_prj_data.m_scr_blocks_height + 1) >> 1):_prj_data.m_scr_blocks_height);

            load_screens(_br, _prj_data.m_ver, _scr_type, _prj_data.m_scr_align, prj_scr_tiles_width, prj_scr_tiles_height, _data);
        }
示例#15
0
        public int num_screens(int _bank_ind)
        {
            tiles_data data = m_data_mngr.get_tiles_data(_bank_ind);

            if (data != null)
            {
                return(data.screen_data_cnt());
            }

            return(-1);
        }
示例#16
0
        public ulong[] get_tiles(int _bank_ind)
        {
            tiles_data data = m_data_mngr.get_tiles_data(_bank_ind);

            if (data != null)
            {
                return(copy_arr <ulong>(data.tiles));
            }

            return(null);
        }
示例#17
0
        public uint[] get_blocks(int _bank_ind)
        {
            tiles_data data = m_data_mngr.get_tiles_data(_bank_ind);

            if (data != null)
            {
                return(copy_arr <uint>(data.blocks));
            }

            return(null);
        }
示例#18
0
        public byte[] get_CHRs_data(int _bank_ind)
        {
            tiles_data data = m_data_mngr.get_tiles_data(_bank_ind);

            if (data != null)
            {
                return(copy_arr <byte>(data.CHR_bank));
            }

            return(null);
        }
示例#19
0
        public int get_palette_slots(int _bank_ind)
        {
            tiles_data data = m_data_mngr.get_tiles_data(_bank_ind);

            if (data != null)
            {
                return(data.palettes_arr.Count);
            }

            return(-1);
        }
示例#20
0
 public void export(string _filename, tiles_data _data, ImageList _tiles_imgs, ImageList _blocks_imgs)
 {
     if (RBtnTiles.Checked)
     {
         export_tiles_blocks_data(_data.get_first_free_tile_id(false), 32, _tiles_imgs, _filename);
     }
     else
     {
         export_tiles_blocks_data(_data.get_first_free_block_id(false), 16, _blocks_imgs, _filename);
     }
 }
示例#21
0
        public int get_CHRs_cnt(int _bank_ind)
        {
            tiles_data data = m_data_mngr.get_tiles_data(_bank_ind);

            if (data != null)
            {
                return(data.get_first_free_spr8x8_id(false));
            }

            return(-1);
        }
示例#22
0
        public void set_data(tiles_data _data)
        {
            m_data = _data;

            CheckBoxAddPattern.Checked = false;
            enable(true);

            update_tree_view();

            update();
        }
示例#23
0
        private void update_data(object sender, EventArgs e)
        {
            data_sets_manager data_mngr = sender as data_sets_manager;

            tiles_data data = data_mngr.get_tiles_data(data_mngr.tiles_data_pos);

            set_palette(data);

            dispatch_event_update_color();

            update();
        }
示例#24
0
        public DialogResult ShowDialog(tiles_data _data)
        {
            m_tiles_data = _data;

            m_color_A = m_color_B = -1;
            CheckBoxColorA.Checked = CheckBoxColorB.Checked = false;

            CheckBoxColorA.ForeColor = CheckBoxColorB.ForeColor = utils.CONST_COLOR_PALETTE_SWAP_COLOR_TEXT_DEFAULT;

            update();

            return(ShowDialog());
        }
示例#25
0
        public void set_selected_block(int _block_id, tiles_data _data)
        {
            if (m_locked == false && _data != null && m_selected_tile_id >= 0)
            {
                _data.set_tile_block(m_selected_tile_id, m_selected_quad_ind, ( ushort )_block_id);

                dispatch_event_need_gfx_update();

                update_status_bar();

                update();
            }
        }
示例#26
0
        public ushort[] get_screen_data(int _bank_ind, int _scr_ind)
        {
            tiles_data data = m_data_mngr.get_tiles_data(_bank_ind);

            if (data != null)
            {
                if (_scr_ind >= 0 && _scr_ind < data.screen_data_cnt())
                {
                    return(copy_arr <ushort>(data.get_screen_data(_scr_ind).m_arr));
                }
            }

            return(null);
        }
        public void post_load_block_data(tiles_data _data)
        {
            if (m_dict_CHR_palette_ind != null)
            {
                foreach (var obj in m_dict_CHR_palette_ind)
                {
                    _data.CHR_bank_spr8x8_change_proc(obj.Key, delegate(byte _pix)
                    {
                        return(( byte )(_pix + (obj.Value * utils.CONST_PALETTE_SMALL_NUM_COLORS)));
                    });
                }

                m_dict_CHR_palette_ind.Clear();
                m_dict_CHR_palette_ind = null;
            }
        }
示例#28
0
        bool check_blocks_CHR(int _CHR_id, tiles_data _data)
        {
            int i;
            int block_n;

            uint block_data;

            byte[] img_buff = new byte[utils.CONST_SPR8x8_TOTAL_PIXELS_CNT];

            _data.from_CHR_bank_to_spr8x8(_CHR_id, img_buff, 0);

            // check duplicate(s)
            for (int CHR_n = 0; CHR_n < _CHR_id; CHR_n++)
            {
                _data.from_CHR_bank_to_spr8x8(CHR_n, utils.tmp_spr8x8_buff, 0);

                if (System.Linq.Enumerable.SequenceEqual(img_buff, utils.tmp_spr8x8_buff) == true)
                {
                    // remove duplicate(s)
                    for (block_n = 0; block_n < platform_data.get_max_blocks_UINT_cnt(); block_n += utils.CONST_BLOCK_SIZE)
                    {
                        for (i = 0; i < utils.CONST_BLOCK_SIZE; i++)
                        {
                            block_data = _data.blocks[block_n + i];

                            if (_CHR_id == tiles_data.get_block_CHR_id(block_data))
                            {
                                _data.blocks[block_n + i] = tiles_data.set_block_CHR_id(CHR_n, block_data);
                            }
                        }
                    }
                }
            }

            for (block_n = 0; block_n < platform_data.get_max_blocks_UINT_cnt(); block_n += utils.CONST_BLOCK_SIZE)
            {
                for (i = 0; i < utils.CONST_BLOCK_SIZE; i++)
                {
                    if (_CHR_id == tiles_data.get_block_CHR_id(_data.blocks[block_n + i]))
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }
示例#29
0
        public long export_CHR_data(int _bank_ind, string _filename)
#endif
        {
            long data_size = -1;

            tiles_data data = m_data_mngr.get_tiles_data(_bank_ind);

            BinaryWriter bw = null;

            try
            {
                if (data != null)
                {
                    bw = new BinaryWriter(File.Open(_filename, FileMode.Create));
#if DEF_NES
                    data_size = data.export_CHR(bw, _save_padding);
#elif DEF_SMS
                    if (_bpp < 1 || _bpp > 4)
                    {
                        throw new Exception("Invalid CHRs bpp value! The valid range is 1-4.");
                    }

                    data_size = data.export_CHR(bw, _bpp);
#elif DEF_PCE || DEF_ZX || DEF_SMD
                    data_size = data.export_CHR(bw);
#endif
                }
                else
                {
                    throw new Exception("Invalid bank index ( " + _bank_ind + " )! Use " + CONST_PREFIX + "num_banks() to get a valid range!");
                }
            }
            catch (Exception _err)
            {
                throw new Exception(CONST_PREFIX + "export_CHR_data error! Can't save CHR data!\n" + _err.Message);
            }

            finally
            {
                if (bw != null)
                {
                    bw.Close();
                }
            }

            return(data_size);
        }
示例#30
0
 public void set_palette(tiles_data _data)
 {
     if (_data != null)
     {
         m_plt_arr[0].set_color_inds(_data.palette0);
         m_plt_arr[1].set_color_inds(_data.palette1);
         m_plt_arr[2].set_color_inds(_data.palette2);
         m_plt_arr[3].set_color_inds(_data.palette3);
     }
     else
     {
         m_plt_arr[0].set_color_inds(null);
         m_plt_arr[1].set_color_inds(null);
         m_plt_arr[2].set_color_inds(null);
         m_plt_arr[3].set_color_inds(null);
     }
 }