//イベント用のワールドマップを描画する public static Bitmap DrawWorldMapEvent( uint image , uint palette //通常パレット , uint tsa //TSA ) { image = U.toOffset(image); palette = U.toOffset(palette); tsa = U.toOffset(tsa); if (!U.isSafetyOffset(image)) { return(ImageUtil.BlankDummy()); } if (!U.isSafetyOffset(palette)) { return(ImageUtil.BlankDummy()); } if (!U.isSafetyOffset(tsa)) { return(ImageUtil.BlankDummy()); } byte[] imageUZ = LZ77.decompress(Program.ROM.Data, image); byte[] tsaUZ = LZ77.decompress(Program.ROM.Data, tsa); return(ImageUtil.ByteToImage16TileHeaderTSA(256, 160 , imageUZ, 0 , Program.ROM.Data, (int)palette , tsaUZ, 0 )); }
public static Bitmap DrawImage(uint table, uint tsa, uint palette) { if (!U.isPointer(table)) { return(ImageUtil.BlankDummy()); } if (!U.isPointer(tsa)) { return(ImageUtil.BlankDummy()); } if (!U.isPointer(palette)) { return(ImageUtil.BlankDummy()); } table = U.toOffset(table); List <byte> imageUZList = new List <byte>(); for (int i = 0; i < 10; i++) { uint image = Program.ROM.u32((uint)(table + (i * 4))); if (!U.isPointer(image)) { return(ImageUtil.BlankDummy()); } byte[] imageUZ = LZ77.decompress(Program.ROM.Data, U.toOffset(image)); imageUZList.AddRange(imageUZ); } return(ImageUtil.ByteToImage16TileHeaderTSA(32 * 8, 20 * 8, imageUZList.ToArray(), 0, Program.ROM.Data, (int)U.toOffset(palette), Program.ROM.Data, (int)U.toOffset(tsa))); }
public static Bitmap DrawImage(uint image, uint tsa) { if (!U.isPointer(image)) { return(ImageUtil.BlankDummy()); } if (!U.isPointer(tsa)) { return(ImageUtil.BlankDummy()); } uint palette = Program.ROM.p32(Program.ROM.RomInfo.ed_staffroll_palette_pointer); byte[] imageUZ = LZ77.decompress(Program.ROM.Data, U.toOffset(image)); byte[] tsaUZ = LZ77.decompress(Program.ROM.Data, U.toOffset(tsa)); if (imageUZ.Length <= 0) { return(ImageUtil.BlankDummy()); } if (tsaUZ.Length <= 0) { return(ImageUtil.BlankDummy()); } return(ImageUtil.ByteToImage16TileHeaderTSA(32 * 8, 32 * 8, imageUZ, 0, Program.ROM.Data, (int)U.toOffset(palette), tsaUZ, 0)); }
static Bitmap DrawOneImage(uint image, uint tsa, uint palette) { if (!U.isPointer(image)) { return(ImageUtil.BlankDummy()); } if (!U.isPointer(palette)) { return(ImageUtil.BlankDummy()); } if (!U.isPointer(tsa)) { return(ImageUtil.BlankDummy()); } byte[] imageUZ = LZ77.decompress(Program.ROM.Data, U.toOffset(image)); return(ImageUtil.ByteToImage16TileHeaderTSA(32 * 8, 20 * 8, imageUZ, 0, Program.ROM.Data, (int)U.toOffset(palette), Program.ROM.Data, (int)U.toOffset(tsa))); }
static Bitmap DrawTSAAnime2(uint image, uint palette, uint tsa) { if (!U.isPointer(image)) { return(ImageUtil.BlankDummy()); } if (!U.isPointer(palette)) { return(ImageUtil.BlankDummy()); } if (!U.isPointer(tsa)) { return(ImageUtil.BlankDummy()); } byte[] imageUZ = LZ77.decompress(Program.ROM.Data, U.toOffset(image)); int height = (int)ImageUtil.CalcByteLengthForHeaderTSAData(Program.ROM.Data, (int)U.toOffset(tsa)); return(ImageUtil.ByteToImage16TileHeaderTSA(32 * 8, height, imageUZ, 0, Program.ROM.Data, (int)U.toOffset(palette), Program.ROM.Data, (int)U.toOffset(tsa))); }
//FE7のワールドマップを描画する //詳細は、呼び出し元のメソッドを見てね. public static Bitmap DrawWorldMapFE7(uint imagemap, uint palette, uint tsamap) { Bitmap map = ImageUtil.Blank(1024, 688); map.Palette = ImageUtil.ByteToPalette(map.Palette, Program.ROM.Data, (int)palette); for (int y = 0; y < 2; y++) { for (int x = 0; x < 4; x++) { uint image = Program.ROM.p32(imagemap); uint tsa = Program.ROM.p32(tsamap); Bitmap piece = ImageUtil.ByteToImage16TileHeaderTSA(256, 256, Program.ROM.Data, (int)image, Program.ROM.Data, (int)palette, Program.ROM.Data, (int)tsa); ImageUtil.BitBlt(map, x * 256, y * 256, 256, 256, piece, 0, 0); imagemap += 4; tsamap += 4; } } //最後のラインだけheightが違う. { int y = 2; for (int x = 0; x < 4; x++) { uint image = Program.ROM.p32(imagemap); uint tsa = Program.ROM.p32(tsamap); Bitmap piece = ImageUtil.ByteToImage16TileHeaderTSA(256, 256, Program.ROM.Data, (int)image, Program.ROM.Data, (int)palette, Program.ROM.Data, (int)tsa); ImageUtil.BitBlt(map, x * 256, y * 256, 256, 176, piece, 0, 0); imagemap += 4; tsamap += 4; } } return(map); }
public static Bitmap DrawTSAAnime(uint image, uint palette, uint tsa) { if (!U.isPointer(image)) { return(ImageUtil.BlankDummy()); } if (!U.isPointer(palette)) { return(ImageUtil.BlankDummy()); } if (!U.isPointer(tsa)) { return(ImageUtil.BlankDummy()); } byte[] imageUZ = LZ77.decompress(Program.ROM.Data, U.toOffset(image)); byte[] tsaUZ = LZ77.decompress(Program.ROM.Data, U.toOffset(tsa)); int height = ImageUtil.CalcHeightbyTSA(32 * 8, tsaUZ.Length); Debug.Assert(height >= 20 * 8); return(ImageUtil.ByteToImage16TileHeaderTSA(32 * 8, height, imageUZ, 0, Program.ROM.Data, (int)U.toOffset(palette), tsaUZ, 0)); }
public static Bitmap DrawImage(uint table, uint tsa, uint palette) { if (!ROM.isPointer(table)) { return(ImageUtil.Blank(8, 8)); } if (!ROM.isPointer(tsa)) { return(ImageUtil.Blank(8, 8)); } if (!ROM.isPointer(palette)) { return(ImageUtil.Blank(8, 8)); } table = ROM.toOffset(table); List <byte> imageUZList = new List <byte>(); for (int i = 0; i < 10; i++) { uint image = Program.ROM.u32((uint)(table + (i * 4))); if (!ROM.isPointer(image)) { return(ImageUtil.Blank(8, 8)); } byte[] imageUZ = LZ77.decompress(Program.ROM.Data, ROM.toOffset(image)); imageUZList.AddRange(imageUZ); } return(ImageUtil.ByteToImage16TileHeaderTSA(32 * 8, 20 * 8 , imageUZList.ToArray(), 0 , Program.ROM.Data, (int)ROM.toOffset(palette) , Program.ROM.Data, (int)ROM.toOffset(tsa) , 0x8000 //TSAに謎の係数を足しながら、最下層のラインから格納するらしい , -0x80 //パレット番号が0x80シフトされるらしい )); }
private void Draw() { byte[] image; int image_pos; if (ImageOption.SelectedIndex == 0 || ImageOption.SelectedIndex == 3) {//圧縮画像 image = LZ77.decompress(Program.ROM.Data , U.toOffset((uint)Image.Value)); image_pos = 0; if (image.Length <= 2) { X_BG_PIC.Image = null; this.USE_PALETTE_NUMBER.Text = "1"; this.DrawBimap = null; return; } } else if (ImageOption.SelectedIndex == 2) {//第2圧縮画像 image = LZ77.decompress(Program.ROM.Data, U.toOffset((uint)Image.Value)); byte[] image2 = LZ77.decompress(Program.ROM.Data, U.toOffset((uint)Image2.Value)); image_pos = 0; if (image.Length <= 2) { X_BG_PIC.Image = null; this.USE_PALETTE_NUMBER.Text = "1"; this.DrawBimap = null; return; } if (image2.Length > 2) { List <byte> imageUZList = new List <byte>(); imageUZList.AddRange(image); imageUZList.AddRange(image2); image = imageUZList.ToArray(); } } else {//無圧縮画像 image = Program.ROM.Data; image_pos = (int)U.toOffset((uint)Image.Value); } byte[] tsa; int tsa_pos; if (TSAOption.SelectedIndex == 0) {//TSAを利用しない tsa = null; tsa_pos = 0; Bitmap bitmap; if (ImageOption.SelectedIndex == 3) {///256 bitmap = ImageUtil.ByteToImage256Tile((int)PicWidth.Value * 8 , (int)PicHeight.Value * 8 , image , image_pos , Program.ROM.Data , (int)ToPaletteOffset((uint)PALETTE.Value, (uint)PALETTENO.Value) ); this.USE_PALETTE_NUMBER.Text = "16"; } else { bitmap = ImageUtil.ByteToImage16Tile((int)PicWidth.Value * 8 , (int)PicHeight.Value * 8 , image , image_pos , Program.ROM.Data , (int)ToPaletteOffset((uint)PALETTE.Value, (uint)PALETTENO.Value) , 0 ); this.USE_PALETTE_NUMBER.Text = ImageUtil.GetPalette16Count(bitmap).ToString(); } X_BG_PIC.Image = U.Zoom(bitmap, ZoomComboBox.SelectedIndex); this.DrawBimap = bitmap; } else if (TSAOption.SelectedIndex == 1) {//圧縮TSAを利用する tsa = LZ77.decompress(Program.ROM.Data, U.toOffset((uint)TSA.Value)); tsa_pos = 0; if (tsa.Length <= 2) { X_BG_PIC.Image = ImageUtil.BlankDummy(); return; } Bitmap bitmap; if (ImageOption.SelectedIndex == 3) {///256 bitmap = ImageUtil.ByteToImage256Tile((int)PicWidth.Value * 8 , (int)PicHeight.Value * 8 , image , image_pos , Program.ROM.Data , (int)ToPaletteOffset((uint)PALETTE.Value, (uint)PALETTENO.Value) , tsa , tsa_pos ); this.USE_PALETTE_NUMBER.Text = "16"; } else { bitmap = ImageUtil.ByteToImage16Tile((int)PicWidth.Value * 8 , (int)PicHeight.Value * 8 , image , image_pos , Program.ROM.Data , (int)ToPaletteOffset((uint)PALETTE.Value, (uint)PALETTENO.Value) , tsa , tsa_pos , 0 ); this.USE_PALETTE_NUMBER.Text = ImageUtil.GetPalette16CountForTSA(tsa, (uint)tsa_pos, (uint)(PicWidth.Value * PicHeight.Value)).ToString(); } X_BG_PIC.Image = U.Zoom(bitmap, ZoomComboBox.SelectedIndex); this.DrawBimap = bitmap; } else if (TSAOption.SelectedIndex == 2) {//圧縮ヘッダ付きTSAを利用する tsa = LZ77.decompress(Program.ROM.Data, U.toOffset((uint)TSA.Value)); tsa_pos = 0; if (tsa.Length <= 2) { X_BG_PIC.Image = ImageUtil.BlankDummy(); return; } Bitmap bitmap; if (ImageOption.SelectedIndex == 3) {///256 bitmap = ImageUtil.ByteToImage256TileHeaderTSA((int)PicWidth.Value * 8, (int)PicHeight.Value * 8, image, image_pos, Program.ROM.Data, (int)ToPaletteOffset((uint)PALETTE.Value, (uint)PALETTENO.Value), tsa, tsa_pos); this.USE_PALETTE_NUMBER.Text = "16"; } else { bitmap = ImageUtil.ByteToImage16TileHeaderTSA((int)PicWidth.Value * 8, (int)PicHeight.Value * 8, image, image_pos, Program.ROM.Data, (int)ToPaletteOffset((uint)PALETTE.Value, (uint)PALETTENO.Value), tsa, tsa_pos); this.USE_PALETTE_NUMBER.Text = ImageUtil.GetPalette16CountForTSA(tsa, (uint)tsa_pos + 2, (uint)(PicWidth.Value * PicHeight.Value)).ToString(); } X_BG_PIC.Image = U.Zoom(bitmap, ZoomComboBox.SelectedIndex); this.DrawBimap = bitmap; } else if (TSAOption.SelectedIndex == 3) {//無圧縮ヘッダ付きTSAを利用する tsa = Program.ROM.Data; tsa_pos = (int)U.toOffset((uint)TSA.Value); Bitmap bitmap; if (ImageOption.SelectedIndex == 3) {///256 bitmap = ImageUtil.ByteToImage256TileHeaderTSA((int)PicWidth.Value * 8, (int)PicHeight.Value * 8, image, image_pos, Program.ROM.Data, (int)ToPaletteOffset((uint)PALETTE.Value, (uint)PALETTENO.Value), tsa, tsa_pos); this.USE_PALETTE_NUMBER.Text = "16"; } else { bitmap = ImageUtil.ByteToImage16TileHeaderTSA((int)PicWidth.Value * 8, (int)PicHeight.Value * 8, image, image_pos, Program.ROM.Data, (int)ToPaletteOffset((uint)PALETTE.Value, (uint)PALETTENO.Value), tsa, tsa_pos); this.USE_PALETTE_NUMBER.Text = ImageUtil.GetPalette16CountForTSA(tsa, (uint)tsa_pos + 2, (uint)(PicWidth.Value * PicHeight.Value)).ToString(); } X_BG_PIC.Image = U.Zoom(bitmap, ZoomComboBox.SelectedIndex); this.DrawBimap = bitmap; } else if (TSAOption.SelectedIndex == 4) {//無圧縮TSAを利用する tsa = Program.ROM.Data; tsa_pos = (int)U.toOffset((uint)TSA.Value); Bitmap bitmap; if (ImageOption.SelectedIndex == 3) {///256 bitmap = ImageUtil.ByteToImage256Tile((int)PicWidth.Value * 8, (int)PicHeight.Value * 8, image, image_pos, Program.ROM.Data, (int)ToPaletteOffset((uint)PALETTE.Value, (uint)PALETTENO.Value), tsa, tsa_pos); this.USE_PALETTE_NUMBER.Text = "16"; } else { bitmap = ImageUtil.ByteToImage16Tile((int)PicWidth.Value * 8, (int)PicHeight.Value * 8, image, image_pos, Program.ROM.Data, (int)ToPaletteOffset((uint)PALETTE.Value, (uint)PALETTENO.Value), tsa, tsa_pos); this.USE_PALETTE_NUMBER.Text = ImageUtil.GetPalette16CountForTSA(tsa, (uint)tsa_pos, (uint)(PicWidth.Value * PicHeight.Value)).ToString(); } X_BG_PIC.Image = U.Zoom(bitmap, ZoomComboBox.SelectedIndex); this.DrawBimap = bitmap; } else if (TSAOption.SelectedIndex == 5) {//パレットマップとして解釈する tsa = Program.ROM.Data; tsa_pos = (int)U.toOffset((uint)TSA.Value); Bitmap bitmap = ImageUtil.ByteToImage16TilePaletteMap((int)PicWidth.Value * 8 , (int)PicHeight.Value * 8 , image , image_pos , Program.ROM.Data , (int)ToPaletteOffset((uint)PALETTE.Value, (uint)PALETTENO.Value) , tsa , tsa_pos ); X_BG_PIC.Image = U.Zoom(bitmap, ZoomComboBox.SelectedIndex); this.USE_PALETTE_NUMBER.Text = "4"; this.DrawBimap = bitmap; } else { this.DrawBimap = null; } }
private void Draw() { byte[] image; int image_pos; if (ImageOption.SelectedIndex == 0 || ImageOption.SelectedIndex == 3) {//圧縮画像 image = LZ77.decompress(Program.ROM.Data , U.toOffset(Image.Value)); image_pos = 0; if (image.Length <= 2) { X_BG_PIC.Image = null; this.USE_PALETTE_NUMBER.Text = "1"; this.DrawBimap = null; return; } } else if (ImageOption.SelectedIndex == 2) {//第2圧縮画像 image = LZ77.decompress(Program.ROM.Data, U.toOffset(Image.Value)); byte[] image2 = LZ77.decompress(Program.ROM.Data, U.toOffset(Image2.Value)); image_pos = 0; if (image.Length <= 2) { X_BG_PIC.Image = null; this.USE_PALETTE_NUMBER.Text = "1"; this.DrawBimap = null; return; } if (image2.Length > 2) { List <byte> imageUZList = new List <byte>(); imageUZList.AddRange(image); imageUZList.AddRange(image2); image = imageUZList.ToArray(); } } else {//無圧縮画像 image = Program.ROM.Data; image_pos = (int)U.toOffset(Image.Value); } byte[] palette; if (PaletteOption.SelectedIndex == 1) {//lz77 palette palette = LZ77.decompress(Program.ROM.Data, U.toOffset(PALETTE.Value)); uint palette_offset = ToPaletteOffset(0, (uint)PALETTENO.Value); palette = U.subrange(palette, palette_offset, palette_offset + (0x20 * 16)); } else {//通常のパレット uint palette_addr = ToPaletteOffset((uint)PALETTE.Value, (uint)PALETTENO.Value); palette = Program.ROM.getBinaryData(palette_addr, 0x20 * 16); } byte[] tsa; int tsa_pos; if (TSAOption.SelectedIndex == 0) {//TSAを利用しない tsa = null; tsa_pos = 0; Bitmap bitmap; if (ImageOption.SelectedIndex == 3) {///256 bitmap = ImageUtil.ByteToImage256Tile((int)PicWidth.Value * 8 , (int)PicHeight.Value * 8 , image , image_pos , palette , 0 ); this.USE_PALETTE_NUMBER.Text = "16"; } else { bitmap = ImageUtil.ByteToImage16Tile((int)PicWidth.Value * 8 , (int)PicHeight.Value * 8 , image , image_pos , palette , 0 , 0 ); this.USE_PALETTE_NUMBER.Text = ImageUtil.GetPalette16Count(bitmap).ToString(); } X_BG_PIC.Image = U.Zoom(bitmap, ZoomComboBox.SelectedIndex); this.DrawBimap = bitmap; } else if (TSAOption.SelectedIndex == 1) {//圧縮TSAを利用する tsa = LZ77.decompress(Program.ROM.Data, U.toOffset(TSA.Value)); tsa_pos = 0; if (tsa.Length <= 2) { X_BG_PIC.Image = ImageUtil.BlankDummy(); return; } Bitmap bitmap; if (ImageOption.SelectedIndex == 3) {///256 bitmap = ImageUtil.ByteToImage256Tile((int)PicWidth.Value * 8 , (int)PicHeight.Value * 8 , image , image_pos , palette , 0 , tsa , tsa_pos ); this.USE_PALETTE_NUMBER.Text = "16"; } else { bitmap = ImageUtil.ByteToImage16Tile((int)PicWidth.Value * 8 , (int)PicHeight.Value * 8 , image , image_pos , palette , 0 , tsa , tsa_pos , 0 ); this.USE_PALETTE_NUMBER.Text = ImageUtil.GetPalette16CountForTSA(tsa, (uint)tsa_pos, (uint)(PicWidth.Value * PicHeight.Value)).ToString(); } X_BG_PIC.Image = U.Zoom(bitmap, ZoomComboBox.SelectedIndex); this.DrawBimap = bitmap; } else if (TSAOption.SelectedIndex == 2) {//圧縮ヘッダ付きTSAを利用する tsa = LZ77.decompress(Program.ROM.Data, U.toOffset(TSA.Value)); tsa_pos = 0; if (tsa.Length <= 2) { X_BG_PIC.Image = ImageUtil.BlankDummy(); return; } Bitmap bitmap; if (ImageOption.SelectedIndex == 3) {///256 bitmap = ImageUtil.ByteToImage256TileHeaderTSA((int)PicWidth.Value * 8, (int)PicHeight.Value * 8, image, image_pos, palette, 0, tsa, tsa_pos); this.USE_PALETTE_NUMBER.Text = "16"; } else { bitmap = ImageUtil.ByteToImage16TileHeaderTSA((int)PicWidth.Value * 8, (int)PicHeight.Value * 8, image, image_pos, palette, 0, tsa, tsa_pos); this.USE_PALETTE_NUMBER.Text = ImageUtil.GetPalette16CountForTSA(tsa, (uint)tsa_pos + 2, (uint)(PicWidth.Value * PicHeight.Value)).ToString(); } X_BG_PIC.Image = U.Zoom(bitmap, ZoomComboBox.SelectedIndex); this.DrawBimap = bitmap; } else if (TSAOption.SelectedIndex == 3) {//無圧縮ヘッダ付きTSAを利用する tsa = Program.ROM.Data; tsa_pos = (int)U.toOffset(TSA.Value); Bitmap bitmap; if (ImageOption.SelectedIndex == 3) {///256 bitmap = ImageUtil.ByteToImage256TileHeaderTSA((int)PicWidth.Value * 8, (int)PicHeight.Value * 8, image, image_pos, palette, 0, tsa, tsa_pos); this.USE_PALETTE_NUMBER.Text = "16"; } else { bitmap = ImageUtil.ByteToImage16TileHeaderTSA((int)PicWidth.Value * 8, (int)PicHeight.Value * 8, image, image_pos, palette, 0, tsa, tsa_pos); this.USE_PALETTE_NUMBER.Text = ImageUtil.GetPalette16CountForTSA(tsa, (uint)tsa_pos + 2, (uint)(PicWidth.Value * PicHeight.Value)).ToString(); } X_BG_PIC.Image = U.Zoom(bitmap, ZoomComboBox.SelectedIndex); this.DrawBimap = bitmap; } else if (TSAOption.SelectedIndex == 4) {//無圧縮TSAを利用する tsa = Program.ROM.Data; tsa_pos = (int)U.toOffset(TSA.Value); Bitmap bitmap; if (ImageOption.SelectedIndex == 3) {///256 bitmap = ImageUtil.ByteToImage256Tile((int)PicWidth.Value * 8, (int)PicHeight.Value * 8, image, image_pos, palette, 0, tsa, tsa_pos); this.USE_PALETTE_NUMBER.Text = "16"; } else { bitmap = ImageUtil.ByteToImage16Tile((int)PicWidth.Value * 8, (int)PicHeight.Value * 8, image, image_pos, palette, 0, tsa, tsa_pos); this.USE_PALETTE_NUMBER.Text = ImageUtil.GetPalette16CountForTSA(tsa, (uint)tsa_pos, (uint)(PicWidth.Value * PicHeight.Value)).ToString(); } X_BG_PIC.Image = U.Zoom(bitmap, ZoomComboBox.SelectedIndex); this.DrawBimap = bitmap; } else if (TSAOption.SelectedIndex == 5) {//パレットマップとして解釈する tsa = Program.ROM.Data; tsa_pos = (int)U.toOffset(TSA.Value); Bitmap bitmap = ImageUtil.ByteToImage16TilePaletteMap((int)PicWidth.Value * 8 , (int)PicHeight.Value * 8 , image , image_pos , palette , 0 , tsa , tsa_pos ); X_BG_PIC.Image = U.Zoom(bitmap, ZoomComboBox.SelectedIndex); this.USE_PALETTE_NUMBER.Text = "4"; this.DrawBimap = bitmap; } else { this.DrawBimap = null; } bool tsaeditorVisible = false; if (ImageOption.SelectedIndex != 1) { //無圧縮ではない if (TSAOption.SelectedIndex >= 1) { //TSAを利用する tsaeditorVisible = true; } } TSAEditorButton.Visible = tsaeditorVisible; }