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