Пример #1
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();
            }
        }
Пример #2
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);
     }
 }
Пример #3
0
        public int get_blocks_cnt(int _bank_ind)
        {
            tiles_data data = m_data_mngr.get_tiles_data(_bank_ind);

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

            return(-1);
        }
Пример #4
0
        public int block_reserve_CHRs(int _block_ind, data_sets_manager _data_manager)
        {
            int CHR_pos = 0;

            ushort block_data = 0;

            if (_block_ind >= 0)
            {
                tiles_data data = _data_manager.get_tiles_data(_data_manager.tiles_data_pos);

                if (data.block_sum(_block_ind) != 0)
                {
                    if (MainForm.message_box("All the block's CHR links will be replaced!", "Reserve CHRs", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.Cancel)
                    {
                        return(-1);
                    }
                }

                // reset block's links
                for (int i = 0; i < utils.CONST_BLOCK_SIZE; i++)
                {
                    data.blocks[(_block_ind << 2) + i] = 0;
                }

                int ff_block_ind = data.get_first_free_block_id(false) << 2;
                ff_block_ind = ff_block_ind < 4 ? 4:ff_block_ind;

                int block_n;

                for (int CHR_n = 1; CHR_n < platform_data.get_CHR_bank_max_sprites_cnt(); CHR_n++)
                {
                    if (data.spr8x8_sum(CHR_n) == 0)
                    {
                        for (block_n = 4; block_n < ff_block_ind; block_n++)
                        {
                            if (tiles_data.get_block_CHR_id(data.blocks[block_n]) == CHR_n)
                            {
                                break;
                            }
                        }

                        if (block_n == ff_block_ind || ff_block_ind == 4)
                        {
                            data.blocks[(_block_ind << 2) + CHR_pos++] = tiles_data.set_block_CHR_id(CHR_n, block_data);

                            if (CHR_pos == utils.CONST_BLOCK_SIZE)
                            {
                                m_block_editor.set_selected_block(_block_ind, data);

                                MainForm.set_status_msg(String.Format("Block Editor: Block #{0:X2} data reserved", _block_ind));

                                return(1);
                            }
                        }
                    }
                }

                MainForm.message_box("Block Editor: CHR bank is full!", "Reserve Blocks", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }

            return(-1);
        }
Пример #5
0
        private static void check_matched_blocks(tiles_data _data, float _mfactor)
        {
            if (_data != null)
            {
                float match_factor;
                int   diff_pix_n;

                string res = "";

                byte[] A_CHR_buff = new byte[utils.CONST_SPR8x8_TOTAL_PIXELS_CNT];
                byte[] B_CHR_buff = new byte[utils.CONST_SPR8x8_TOTAL_PIXELS_CNT];

                int ff_block_id = _data.get_first_free_block_id(false);

                for (int blockA_n = 0; blockA_n < ff_block_id; blockA_n++)
                {
                    for (int blockB_n = blockA_n; blockB_n < ff_block_id; blockB_n++)
                    {
                        if (blockA_n != blockB_n)
                        {
                            match_factor = 0.0f;

                            for (int CHR_n = 0; CHR_n < 4; CHR_n++)
                            {
                                uint blockA = _data.blocks[(blockA_n << 2) + CHR_n];
                                uint blockB = _data.blocks[(blockB_n << 2) + CHR_n];
#if !DEF_SMS
                                if (tiles_data.get_block_flags_palette(blockA) != tiles_data.get_block_flags_palette(blockB))
                                {
                                    continue;
                                }
#endif
                                int A_CHR_id = tiles_data.get_block_CHR_id(blockA);
                                int B_CHR_id = tiles_data.get_block_CHR_id(blockB);

                                if (A_CHR_id != B_CHR_id)
                                {
                                    _data.from_CHR_bank_to_spr8x8(A_CHR_id, A_CHR_buff, 0);
                                    _data.from_CHR_bank_to_spr8x8(B_CHR_id, B_CHR_buff, 0);

                                    diff_pix_n = 0;

                                    for (int pix_n = 0; pix_n < utils.CONST_SPR8x8_TOTAL_PIXELS_CNT; pix_n++)
                                    {
                                        if (A_CHR_buff[pix_n] != B_CHR_buff[pix_n])
                                        {
                                            ++diff_pix_n;
                                        }
                                    }

                                    match_factor += 25.0f * (1.0f - (diff_pix_n / ( float )utils.CONST_SPR8x8_TOTAL_PIXELS_CNT));
                                }
                                else
                                {
                                    match_factor += 25.0f;
                                }
                            }

                            if (match_factor >= _mfactor)
                            {
                                res += utils.hex("#", blockA_n) + " <-> " + utils.hex("#", blockB_n) + " [" + ( int )match_factor + "%]\n";
                            }
                        }
                    }
                }

                if (res.Length > 0)
                {
                    MainForm.message_box(res, "Matched Blocks", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    MainForm.message_box("No matches found!", "Matched Blocks", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            }
        }
Пример #6
0
        int Blocks_optimization(tiles_data _data, bool _check)
        {
            int deleted_blocks_cnt = 0;

            uint sum;
            int  block_offset;

            int size = _data.get_first_free_block_id(false);

            for (int block_n = 0; block_n < size; block_n++)
            {
                if (check_tiles_block(block_n, _data) == false)
                {
                    sum = 0;

                    block_offset = block_n << 2;

                    for (int i = 0; i < utils.CONST_BLOCK_SIZE; i++)
                    {
                        sum += _data.blocks[block_offset + i];
                    }

                    if (sum != 0)
                    {
                        ++deleted_blocks_cnt;
                    }

                    if (_check == true)
                    {
                        continue;
                    }

                    // delete the useless block
                    {
                        Array.Copy(_data.blocks, block_offset + utils.CONST_BLOCK_SIZE, _data.blocks, block_offset, (platform_data.get_max_blocks_cnt() << 2) /* * utils.CONST_BLOCK_SIZE*/ - (block_offset + utils.CONST_BLOCK_SIZE));
                    }

                    // the last block is an empty space
                    {
                        int last_block_ind = platform_data.get_max_blocks_cnt() << 2;

                        _data.blocks[last_block_ind - 1] = 0;
                        _data.blocks[last_block_ind - 2] = 0;
                        _data.blocks[last_block_ind - 3] = 0;
                        _data.blocks[last_block_ind - 4] = 0;
                    }

                    if (m_data_sets.screen_data_type == data_sets_manager.EScreenDataType.sdt_Tiles4x4)
                    {
                        shift_tiles_data(block_n, _data);
                    }
                    else
                    {
                        _data.dec_screen_tiles(( ushort )block_n);
                        _data.dec_patterns_tiles(( ushort )block_n);
                    }

                    --block_n;
                    --size;
                }
            }

            return(deleted_blocks_cnt);
        }
Пример #7
0
        void BtnOkClick_Event(object sender, EventArgs e)
        {
            if (m_color_A >= 0 && m_color_B >= 0)
            {
#if DEF_PALETTE16_PER_CHR
                int pix_n;
                int CHR_id;
                int CHR_n;
                int block_n;

                bool[] CHR_flags = new bool[platform_data.get_CHR_bank_max_sprites_cnt()];
                Array.Clear(CHR_flags, 0, CHR_flags.Length);

                uint block_data;
                int  ff_block_n = m_tiles_data.get_first_free_block_id(false);

                for (block_n = 0; block_n < ff_block_n; block_n++)
                {
                    for (CHR_n = 0; CHR_n < utils.CONST_BLOCK_SIZE; CHR_n++)
                    {
                        block_data = m_tiles_data.blocks[(block_n << 2) + CHR_n];

                        CHR_id = tiles_data.get_block_CHR_id(block_data);

                        if (CHR_flags[CHR_id] == false && (tiles_data.get_block_flags_palette(block_data) == m_tiles_data.palette_pos))
                        {
                            m_tiles_data.from_CHR_bank_to_spr8x8(CHR_id, utils.tmp_spr8x8_buff, 0);

                            for (pix_n = 0; pix_n < utils.CONST_SPR8x8_TOTAL_PIXELS_CNT; pix_n++)
                            {
                                if (utils.tmp_spr8x8_buff[pix_n] == m_color_A)
                                {
                                    utils.tmp_spr8x8_buff[pix_n] = ( byte )m_color_B;
                                }
                                else
                                if (utils.tmp_spr8x8_buff[pix_n] == m_color_B)
                                {
                                    utils.tmp_spr8x8_buff[pix_n] = ( byte )m_color_A;
                                }
                            }

                            m_tiles_data.from_spr8x8_to_CHR_bank(CHR_id, utils.tmp_spr8x8_buff);

                            CHR_flags[CHR_id] = true;
                        }
                    }
                }
#else
                for (int i = 0; i < m_tiles_data.CHR_bank.Length; i++)
                {
                    if (m_tiles_data.CHR_bank[i] == m_color_A)
                    {
                        m_tiles_data.CHR_bank[i] = ( byte )m_color_B;
                    }
                    else
                    if (m_tiles_data.CHR_bank[i] == m_color_B)
                    {
                        m_tiles_data.CHR_bank[i] = ( byte )m_color_A;
                    }
                }
#endif
                int ind_A = m_tiles_data.subpalettes[m_color_A >> 2][m_color_A & 0x03];
                int ind_B = m_tiles_data.subpalettes[m_color_B >> 2][m_color_B & 0x03];

                m_tiles_data.subpalettes[m_color_A >> 2][m_color_A & 0x03] = ind_B;
                m_tiles_data.subpalettes[m_color_B >> 2][m_color_B & 0x03] = ind_A;
                for (int j = 0; j < utils.CONST_NUM_SMALL_PALETTES; j++)
                {
                    palette_group.Instance.get_palettes_arr()[j].update();
                }
            }
            else
            {
                MainForm.message_box("Please, select both Color A and Color B!", "Colors Swapping Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }