public static Bitmap DrawPortraitFE6Map( uint map_face , uint palette ) { int width = 4 * 8; int height = 4 * 8; map_face = U.toOffset(map_face); palette = U.toOffset(palette); if (map_face == 0 || !U.isSafetyOffset(map_face) || !U.isSafetyOffset(palette) ) { //ない. return(ImageUtil.Blank(width, height)); } return(ImageUtil.ByteToImage16Tile(width, height , Program.ROM.Data, (int)map_face , Program.ROM.Data, (int)palette , 0 )); }
public static Bitmap DrawBG(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[] paletteUZ = LZ77.decompress(Program.ROM.Data, U.toOffset(palette)); byte[] tsaUZ = LZ77.decompress(Program.ROM.Data, U.toOffset(tsa)); return(ImageUtil.ByteToImage16Tile(30 * 8, 20 * 8 , imageUZ, 0 , paletteUZ, 0 , tsaUZ, 0 )); }
public static Bitmap DrawIcon(uint index, uint imageBaseAddress) { uint imageOffset = GetIconAddr(index, imageBaseAddress); uint palette = Program.ROM.p32(SkillPalettePointer); //オリジナルROMからあるパレット. return (ImageUtil.ByteToImage16Tile(16, 16, Program.ROM.Data, (int)imageOffset, Program.ROM.Data, (int)palette)); }
static Bitmap GetChipImage(List <int> notUseList, List <int> heightList) { uint[] image_pos = new uint[] { Program.ROM.RomInfo.battle_screen_image1_pointer() , Program.ROM.RomInfo.battle_screen_image2_pointer() , Program.ROM.RomInfo.battle_screen_image3_pointer() , Program.ROM.RomInfo.battle_screen_image4_pointer() , Program.ROM.RomInfo.battle_screen_image5_pointer() }; List <byte[]> unlz77_images = new List <byte[]>(); int total_height = 0; for (int i = 0; i < image_pos.Length; i++) { uint image = Program.ROM.p32(image_pos[i]); byte[] imageUZ = LZ77.decompress(Program.ROM.Data, image); int width = 8; int height = ImageUtil.CalcHeight(width, imageUZ.Length); unlz77_images.Add(imageUZ); total_height += height; heightList.Add(total_height); } uint palette = Program.ROM.p32(Program.ROM.RomInfo.battle_screen_palette_pointer()); Bitmap bitmap = ImageUtil.Blank(8, total_height, Program.ROM.Data, (int)palette); int copy_height = 0; for (int i = 0; i < image_pos.Length; i++) { byte[] imageUZ = unlz77_images[i]; int width = 8; int height = ImageUtil.CalcHeight(width, imageUZ.Length); if (height <= 0) { continue; } Bitmap src = ImageUtil.ByteToImage16Tile(width, height, imageUZ, 0, Program.ROM.Data, (int)palette); ImageUtil.BitBlt(bitmap, 0, copy_height, 8, height, src, 0, 0); copy_height += height; src.Dispose(); if (i >= 1) { notUseList.Add(copy_height - 8 - 8); notUseList.Add(copy_height - 8); } } return(bitmap); }
public static Bitmap GetPathImage() { uint palette = Program.ROM.p32(Program.ROM.RomInfo.worldmap_icon_palette_pointer()); uint image = Program.ROM.p32(Program.ROM.RomInfo.worldmap_road_tile_pointer()); byte[] imageUZ = LZ77.decompress(Program.ROM.Data, image); int width = 8; int height = ImageUtil.CalcHeight(width, imageUZ.Length); Bitmap bitmap = ImageUtil.ByteToImage16Tile(width, height, imageUZ, 0, Program.ROM.Data, (int)palette, 1); return(bitmap); }
//音楽系の下絵 public static Bitmap BaseMusicImage() { if (SystemMusicCache != null) { return(SystemMusicCache); } uint palette = Program.ROM.p32(Program.ROM.RomInfo.system_music_icon_palette_pointer()); uint image = Program.ROM.p32(Program.ROM.RomInfo.system_music_icon_pointer()); byte[] imageUZ = LZ77.decompress(Program.ROM.Data, image); SystemMusicCache = ImageUtil.ByteToImage16Tile(32 * 8, 4 * 8, imageUZ, 0, Program.ROM.Data, (int)palette); return(SystemMusicCache); }
public static Bitmap LoadMoveUnitIcon(uint pic_address, int palette_type) { uint palette; if (palette_type == 1) {//友軍 palette = Program.ROM.RomInfo.unit_icon_npc_palette_address(); } else if (palette_type == 2) {//敵軍 palette = Program.ROM.RomInfo.unit_icon_enemey_palette_address(); } else if (palette_type == 3) {//グレー palette = Program.ROM.RomInfo.unit_icon_gray_palette_address(); } else if (palette_type == 4) {//4軍 palette = Program.ROM.RomInfo.unit_icon_four_palette_address(); } else {//自軍 palette = Program.ROM.RomInfo.unit_icon_palette_address(); } uint pic_address_offset = U.toOffset(pic_address); if (!U.isSafetyOffset(palette)) { return(ImageUtil.Blank(4 * 8, 4 * 8)); } if (!U.isSafetyOffset(pic_address_offset)) { return(ImageUtil.Blank(4 * 8, 4 * 8)); } byte[] imageUZ = LZ77.decompress(Program.ROM.Data, pic_address_offset); if (imageUZ.Length <= 0) { return(ImageUtil.Blank(4 * 8, 4 * 8)); } int width = 4 * 8; int height = ImageUtil.CalcHeight(width, imageUZ.Length); return(ImageUtil.ByteToImage16Tile(width, height , imageUZ, 0 , Program.ROM.Data, (int)palette , 0 )); }
public static Bitmap DrawFont(uint image) { if (!U.isPointer(image)) { return(ImageUtil.BlankDummy(32)); } uint palette = Program.ROM.p32(Program.ROM.RomInfo.op_class_font_palette_pointer()); byte[] imageUZ = LZ77.decompress(Program.ROM.Data, U.toOffset(image)); return(ImageUtil.ByteToImage16Tile(4 * 8, 4 * 8 , imageUZ, 0 , Program.ROM.Data, (int)U.toOffset(palette) )); }
Bitmap DrawBorderBitmap(uint img) { byte[] bin = LZ77.decompress(Program.ROM.Data, U.toOffset(img)); uint pal = Program.ROM.p32(Program.ROM.RomInfo.worldmap_county_border_palette_pointer()); int height = ImageUtil.CalcHeight(32 * 8, bin.Length); if (height <= 0) { return(ImageUtil.Blank(32 * 8, 4 * 8)); } return(ImageUtil.ByteToImage16Tile(32 * 8, height , bin, 0 , Program.ROM.Data, (int)pal)); }
public static Bitmap Draw(uint image, uint palette) { if (!U.isPointer(image)) { return(ImageUtil.BlankDummy()); } if (!U.isPointer(palette)) { return(ImageUtil.BlankDummy()); } return(ImageUtil.ByteToImage16Tile(4 * 8, 4 * 8 , Program.ROM.Data, (int)U.toOffset(image) , Program.ROM.Data, (int)U.toOffset(palette) )); }
static Bitmap DrawTSAAnime2Header(uint image, uint palette) { if (!U.isPointer(image)) { return(ImageUtil.BlankDummy()); } if (!U.isPointer(palette)) { return(ImageUtil.BlankDummy()); } byte[] imageUZ = LZ77.decompress(Program.ROM.Data, U.toOffset(image)); int height = (int)ImageUtil.CalcHeight(30 * 8, imageUZ.Length); return(ImageUtil.ByteToImage16Tile(30 * 8, height, imageUZ, 0, Program.ROM.Data, (int)U.toOffset(palette))); }
//下絵の取得 public static Bitmap BaseImage() { if (SystemIconCache != null) { return(SystemIconCache); } uint palette = Program.ROM.p32(Program.ROM.RomInfo.system_icon_palette_pointer()); uint image = Program.ROM.p32(Program.ROM.RomInfo.system_icon_pointer()); byte[] imageUZ = LZ77.decompress(Program.ROM.Data, image); Size system_icon_size = GetSystemIconImageSize(); SystemIconCache = ImageUtil.ByteToImage16Tile(system_icon_size.Width, system_icon_size.Height, imageUZ, 0, Program.ROM.Data, (int)palette); return(SystemIconCache); }
public static Bitmap DrawPic(uint addr, int width) { byte[] imageUZ = LZ77.decompress(Program.ROM.Data, U.toOffset(addr)); if (imageUZ.Length <= 0) {//ない return(ImageUtil.Blank(width, 8)); } int height = ImageUtil.CalcHeight(width, imageUZ.Length); uint palette = Program.ROM.RomInfo.image_chapter_title_palette(); return(ImageUtil.ByteToImage16Tile(width, height , imageUZ, 0 , Program.ROM.Data, (int)U.toOffset(palette) , 0 )); }
public static Bitmap DrawIcon(uint addr, uint customPalette = 0) { if (!U.isSafetyOffset(addr)) { return(ImageUtil.BlankDummy()); } if (customPalette == 0) {//アイテムアイコンパレットを利用. customPalette = Program.ROM.u32(Program.ROM.RomInfo.icon_palette_pointer()); } return(ImageUtil.ByteToImage16Tile(2 * 8, 2 * 8 , Program.ROM.Data, (int)addr , Program.ROM.Data, (int)U.toOffset(customPalette) , 0 )); }
static Bitmap GetTileAnime1(uint data_pointer, uint count, uint palette, int palette_index) { uint date_offset = U.toOffset(data_pointer); uint palette_offset = U.toOffset(palette); if (!U.isSafetyOffset(date_offset)) { return(null); } if (!U.isSafetyOffset(palette_offset)) { return(null); } int height = GetHight(count); return (ImageUtil.ByteToImage16Tile(32 * 8, height, Program.ROM.Data, (int)date_offset, Program.ROM.Data, (int)palette_offset, palette_index)); }
Bitmap DrawImageLow(uint tsa, uint image, uint palette) { byte[] tsaByte = LZ77.decompress(Program.ROM.Data, tsa); byte[] imageByte = LZ77.decompress(Program.ROM.Data, image); if (tsaByte.Length <= 0 || imageByte.Length <= 0) { return(null); } int imageHeight = ImageUtil.CalcHeightbyTSA(this.ImageWidth * 8, tsaByte.Length); if (imageHeight > 8 * 16) { imageHeight = 8 * 16; } Bitmap bitmap = ImageUtil.ByteToImage16Tile(this.ImageWidth * 8, imageHeight, imageByte, 0, Program.ROM.Data, (int)palette, tsaByte, 0, 0); return(bitmap); }
//武器の下絵 public static Bitmap BaseWeaponImage() { if (SystemWeaponCache != null) { return(SystemWeaponCache); } uint palette = Program.ROM.p32(Program.ROM.RomInfo.system_weapon_icon_palette_pointer()); uint image = Program.ROM.p32(Program.ROM.RomInfo.system_weapon_icon_pointer()); byte[] imageUZ = LZ77.decompress(Program.ROM.Data, image); if (Program.ROM.RomInfo.version() == 6) { SystemWeaponCache = ImageUtil.ByteToImage16Tile(32 * 8, 3 * 8, imageUZ, 0, Program.ROM.Data, (int)palette); } else { SystemWeaponCache = ImageUtil.ByteToImage16Tile(32 * 8, 2 * 8, imageUZ, 0, Program.ROM.Data, (int)palette); } return(SystemWeaponCache); }
Bitmap GetChipImage() { int pal = this.PaletteIndexComboBox.SelectedIndex; if (pal < 0) { pal = 0; } uint palette; if (this.PalettePointer == U.NOT_FOUND) { palette = U.toOffset(this.PaletteAddress); } else { palette = Program.ROM.p32(this.PalettePointer); } palette = palette + (uint)(pal * 0x20); int total_height = 0; uint image = Program.ROM.p32(this.ZImgPointer); byte[] imageUZ = LZ77.decompress(Program.ROM.Data, image); int width = 8; int height = ImageUtil.CalcHeight(width, imageUZ.Length); Bitmap src = ImageUtil.ByteToImage16Tile(width, height, imageUZ, 0, Program.ROM.Data, (int)palette); Bitmap bitmap = ImageUtil.Blank(8, height, Program.ROM.Data, (int)palette); ImageUtil.BitBlt(bitmap, 0, total_height, 8, height, src, 0, 0); total_height += height; src.Dispose(); return(bitmap); }
static Bitmap DrawFrameImage(uint frame, out string log) { if (!U.isSafetyOffset(frame)) { log = ""; return(ImageUtil.BlankDummy()); } //struct Frames{ // byte wait; // byte 00; // ushort sound; // void* img; // void* pal; //}//sizeof()==12 uint objOffset = Program.ROM.p32(frame + 4); uint palOffset = Program.ROM.p32(frame + 8); if (!U.isSafetyOffset(objOffset)) { log = R._("BAD OBJ_OFFSET {0}", U.To0xHexString(objOffset)); return(ImageUtil.BlankDummy()); } if (!U.isSafetyOffset(palOffset)) { log = R._("BAD PAL_OFFSET {0}", U.To0xHexString(palOffset)); return(ImageUtil.BlankDummy()); } log = R._("IMG {0}, PAL {1}", U.To0xHexString(objOffset), U.To0xHexString(palOffset)); //objは圧縮されている. //palは、0x20(16色1パレット)固定. byte[] obj = LZ77.decompress(Program.ROM.Data, objOffset); Bitmap retImage = ImageUtil.ByteToImage16Tile(SCREEN_WIDTH, SCREEN_HEIGHT, obj, 0, Program.ROM.Data, (int)palOffset); return(retImage); }
private void P8_ValueChanged(object sender, EventArgs e) { uint addr = U.toOffset((uint)P8.Value); if (!U.isSafetyOffset(addr)) { X_NAME_IMG.Image = null; return; } byte[] img = LZ77.decompress(Program.ROM.Data, addr); if (img.Length <= 0) { X_NAME_IMG.Image = null; return; } uint paletteAddr = Program.ROM.p32(JP_FONT_PALETTE_POINTER); if (!U.isSafetyOffset(paletteAddr)) { X_NAME_IMG.Image = null; return; } X_NAME_IMG.Image = ImageUtil.ByteToImage16Tile(32 * 8, 4 * 8, img, 0, Program.ROM.Data, (int)paletteAddr); }
static Bitmap DrawFrameImage(uint frame, uint graphiclist, uint tsalist, uint palettelist) { if (!U.isSafetyOffset(frame)) { return(ImageUtil.BlankDummy()); } //struct Frames{ // ushort id; // ushort wait; //} uint id = Program.ROM.u16(frame + 0); //画像リストなどから、指定ID数、読み飛ばす. uint objPointer = graphiclist + (id * 4); uint tsaPointer = tsalist + (id * 4); uint palPointer = palettelist + (id * 4); if (!U.isSafetyOffset(objPointer + 4)) { return(ImageUtil.BlankDummy()); } if (!U.isSafetyOffset(tsaPointer + 4)) { return(ImageUtil.BlankDummy()); } if (!U.isSafetyOffset(palPointer + 4)) { return(ImageUtil.BlankDummy()); } uint objOffset = Program.ROM.p32(objPointer); uint tsaOffset = Program.ROM.p32(tsaPointer); uint palOffset = Program.ROM.p32(palPointer); if (!U.isSafetyOffset(objOffset)) { return(ImageUtil.BlankDummy()); } if (!U.isSafetyOffset(tsaOffset)) { return(ImageUtil.BlankDummy()); } if (!U.isSafetyOffset(palOffset + 0x20)) { return(ImageUtil.BlankDummy()); } //objとtsaは圧縮されている. //palは、0x20(16色1パレット)固定. byte[] obj = LZ77.decompress(Program.ROM.Data, objOffset); byte[] tsa = LZ77.decompress(Program.ROM.Data, tsaOffset); int width = SCREEN_WIDTH; int height = ImageUtil.CalcHeightbyTSA(width, tsa.Length); if (height < 160) { height = 160; } Bitmap retImage = ImageUtil.ByteToImage16Tile(width, height, obj, 0, Program.ROM.Data, (int)palOffset, tsa, 0); return(retImage); }
static string ExportBGFrameImage( uint frame , byte[] frameData , string basedir , string basename , List <uint> animeHash ) { basename = basename + "b_"; //0 frame16 byte1 x86 //4 objImagePointer //8 OAMAbsoStart //12 OAMBGAbsoStart //16 bgImagePointer //20 objPalettePointer //24 bgPalettePointer //CSA_Creater 28 TSA uint bgPointer = U.u32(frameData, frame + 16); uint bgPalettePointer = U.u32(frameData, frame + 24); uint bgTSAPointer = U.u32(frameData, frame + 28); uint imageHash = (bgPointer + bgTSAPointer); string framefilename = ""; int seatnumber = animeHash.IndexOf(imageHash); if (seatnumber >= 0) {//すでに出力しているのでカットする. framefilename = basename + seatnumber.ToString("000") + ".png"; return(framefilename); } byte[] bgPalette = Program.ROM.getBinaryData(U.toOffset(bgPalettePointer), 0x20); byte[] bg_UZ = LZ77.decompress(Program.ROM.Data, U.toOffset(bgPointer)); byte[] bgTSA_UZ = LZ77.decompress(Program.ROM.Data, U.toOffset(bgTSAPointer)); if (bg_UZ.Length <= 0 || bgTSA_UZ.Length <= 0) { Log.Error("bg_UZ", U.ToHexString(bgPointer), "or bgTSA_UZ", U.ToHexString(bgTSAPointer), "is null. broken frame."); return(""); } //まだ出力していない画像なので作成します. seatnumber = animeHash.Count; animeHash.Add(imageHash); //int width = 264; //FEditorAdv //int height = 64; int width = 256 - 8 - 8; int height = ImageUtil.CalcHeightbyTSA(width, bgTSA_UZ.Length); if (height >= 160) { height = 160; } else { height = 64; } Bitmap retImage = ImageUtil.Blank(width, height, bgPalette, 0); Bitmap bg = ImageUtil.ByteToImage16Tile(width, height, bg_UZ, 0, bgPalette, 0, bgTSA_UZ, 0, 0); ImageUtil.BitBlt(retImage, 0, 0, bg.Width, bg.Height, bg, 0, 0); ////パレットマークを右上に描画 CSA_Creator では不要らしい. ////ImageUtil.AppendPaletteMark(retImage); //利用していないパレットを消す. ImageUtil.BlackOutUnnecessaryColors(retImage, 1); framefilename = basename + seatnumber.ToString("000") + ".png"; if (!U.BitmapSave(retImage, Path.Combine(basedir, framefilename))) { return(""); } retImage.Dispose(); return(framefilename); }
static Bitmap DrawFrameImage(uint frame , byte[] frameData , uint objRightToLeftOAM , uint objBGRightToLeftOAM , bool bgExpands) { //0 frame16 byte1 x86 //4 objImagePointer //8 OAMAbsoStart //12 OAMBGAbsoStart //16 bgImagePointer //20 objPalettePointer //24 bgPalettePointer //CSA_Creater 28 TSA uint objPalettePointer = U.u32(frameData, frame + 20); if (!U.isSafetyPointer(objPalettePointer)) { return(ImageUtil.BlankDummy()); } byte[] objPalette = Program.ROM.getBinaryData(U.toOffset(objPalettePointer), 0x20); uint bgPalettePointer = U.u32(frameData, frame + 24); if (!U.isSafetyPointer(bgPalettePointer)) { return(ImageUtil.BlankDummy()); } byte[] bgPalette = Program.ROM.getBinaryData(U.toOffset(bgPalettePointer), 0x20); Bitmap retImage = ImageUtil.Blank((ImageUtilOAM.SEAT_TILE_WIDTH - 2) * 8, ImageUtilOAM.SEAT_TILE_HEIGHT * 8 * 2, objPalette, 0); uint bgPointer = U.u32(frameData, frame + 16); if (!U.isSafetyPointer(bgPointer)) { return(ImageUtil.BlankDummy()); } byte[] bg_UZ = LZ77.decompress(Program.ROM.Data, U.toOffset(bgPointer)); uint bgTSAPointer = U.u32(frameData, frame + 28); if (!U.isSafetyPointer(bgTSAPointer)) { return(ImageUtil.BlankDummy()); } byte[] bgTSA_UZ = LZ77.decompress(Program.ROM.Data, U.toOffset(bgTSAPointer)); int width = 256 - 8 - 8; int height = ImageUtil.CalcHeightbyTSA(width, bgTSA_UZ.Length); if (height < 160) { height = 160; } Bitmap bg = ImageUtil.ByteToImage16Tile(width, height, bg_UZ, 0, bgPalette, 0, bgTSA_UZ, 0); ImageUtil.AppendPalette(retImage, bg, 1); if (bgExpands) { Bitmap tempbg = ImageUtil.Blank(width, height, bg); ImageUtil.Scale(tempbg, 0, 0, width, 160 - 32, bg, 0, 0, width, 64); bg = tempbg; } ImageUtil.BitBlt(retImage, 0, 0, bg.Width, bg.Height, bg, 0, 0, 1); uint objImagePointer = U.u32(frameData, frame + 4); if (!U.isSafetyPointer(objImagePointer)) { return(ImageUtil.BlankDummy()); } byte[] obj_UZ = LZ77.decompress(Program.ROM.Data, U.toOffset(objImagePointer)); if (obj_UZ.Length > 0) { width = 256; height = ImageUtil.CalcHeight(width, obj_UZ.Length); if (height < 64) { height = 64; } Bitmap obj = ImageUtil.ByteToImage16Tile(width, height, obj_UZ, 0, objPalette, 0); { //利用するOAMデータの開始位置 //OAMは 12byte で 最初の1バイト目が 1になるまで続きます. uint OAMBGAbsoStart = U.u32(frameData, frame + 12); ImageUtilOAM.DrawOAM oam = new ImageUtilOAM.DrawOAM(); oam.SetIsMagicOAM(true); oam.Parse(Program.ROM.Data, objBGRightToLeftOAM + OAMBGAbsoStart); Bitmap tempCanvas = ImageUtil.Blank((ImageUtilOAM.SEAT_TILE_WIDTH - 2) * 8, ImageUtilOAM.SEAT_TILE_HEIGHT * 8 * 2, objPalette, 0); tempCanvas = oam.Draw(tempCanvas, obj); ImageUtil.BitBlt(retImage, 0, 0, tempCanvas.Width, tempCanvas.Height, tempCanvas, 0, 0, 0, 0); tempCanvas.Dispose(); } { //利用するOAMデータの開始位置 //OAMは 12byte で 最初の1バイト目が 1になるまで続きます. uint OAMAbsoStart = U.u32(frameData, frame + 8); ImageUtilOAM.DrawOAM oam = new ImageUtilOAM.DrawOAM(); oam.SetIsMagicOAM(true); oam.Parse(Program.ROM.Data, objRightToLeftOAM + OAMAbsoStart); Bitmap tempCanvas = ImageUtil.Blank((ImageUtilOAM.SEAT_TILE_WIDTH - 2) * 8, ImageUtilOAM.SEAT_TILE_HEIGHT * 8 * 2, objPalette, 0); tempCanvas = oam.Draw(tempCanvas, obj); ImageUtil.BitBlt(retImage, 0, 0, tempCanvas.Width, tempCanvas.Height, tempCanvas, 0, 0, 0, 0); tempCanvas.Dispose(); } } return(retImage); }
//マップチップだけを描画する public static Bitmap DrawMapChipOnly( uint obj_plist //image , uint palette_plist //palette , MapSettingForm.MapAnimations anime = null ) { uint obj_offset = MapPointerForm.PlistToOffsetAddr(MapPointerForm.PLIST_TYPE.OBJECT, obj_plist & 0xFF); uint obj2_plist = (obj_plist >> 8) & 0xFF; //FE8にはないが FE7は、 plistを2つ設定できることがある. uint obj2_offset = 0; uint palette_offset = MapPointerForm.PlistToOffsetAddr(MapPointerForm.PLIST_TYPE.PALETTE, palette_plist); if (!U.isSafetyOffset(obj_offset)) { return(null); } if (!U.isSafetyOffset(palette_offset)) { return(null); } if (obj2_plist > 0) {//plist2があれば obj2_offset = MapPointerForm.PlistToOffsetAddr(MapPointerForm.PLIST_TYPE.OBJECT, obj2_plist); if (!U.isSafetyOffset(obj2_offset)) { return(null); } } byte[] objUZ = LZ77.decompress(Program.ROM.Data, obj_offset); //image if (objUZ.Length <= 0) //image { return(null); } if (obj2_plist > 0) { //plist2があれば byte[] obj2UZ = LZ77.decompress(Program.ROM.Data, obj2_offset); if (obj2UZ.Length <= 0) //image { return(null); } objUZ = U.ArrayAppend(objUZ, obj2UZ); } byte[] paletteData = Program.ROM.getBinaryData(palette_offset, (2 * 16) * 16); //マップアニメが定義されていればアニメーション補正する. if (anime != null) { if (anime.change_bitmap_bytes != null) { U.ArrayPatch(anime.change_bitmap_bytes, 0, objUZ, 32 * (8 / 2) * 4 * 16); } if (anime.change_palette_bytes != null) { U.ArrayPatch(anime.change_palette_bytes, 0, paletteData, (anime.change_palette_start_index) * 2); } } //マップチップの読込 int obj_width = 32 * 8; int obj_height = ImageUtil.CalcHeight(obj_width, objUZ.Length); Bitmap obj_image = ImageUtil.ByteToImage16Tile(obj_width, obj_height , objUZ, 0 , paletteData, 0 , 0 ); return(obj_image); }
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; } }
public static Bitmap LoadWaitUnitIcon(uint pic_address, int palette_type, byte b2) { uint palette; if (palette_type == 1) {//友軍 palette = Program.ROM.RomInfo.unit_icon_npc_palette_address; } else if (palette_type == 2) {//敵軍 palette = Program.ROM.RomInfo.unit_icon_enemey_palette_address; } else if (palette_type == 4) {//4軍 palette = Program.ROM.RomInfo.unit_icon_four_palette_address; } else if (palette_type == 3) {//グレー palette = Program.ROM.RomInfo.unit_icon_gray_palette_address; } else if (palette_type == 5) {//光の結界 palette = Program.ROM.RomInfo.unit_icon_lightrune_palette_address; } else if (palette_type == 6) {//セピア palette = Program.ROM.RomInfo.unit_icon_sepia_palette_address; } else {//自軍 palette = Program.ROM.RomInfo.unit_icon_palette_address; } uint pic_address_offset = U.toOffset(pic_address); if (!U.isSafetyOffset(palette)) { return(ImageUtil.Blank(2 * 8, 2 * 8)); } if (!U.isSafetyOffset(pic_address_offset)) { return(ImageUtil.Blank(2 * 8, 2 * 8)); } byte[] imageUZ = LZ77.decompress(Program.ROM.Data, pic_address_offset); if (imageUZ.Length <= 0) { return(ImageUtil.Blank(2 * 8, 2 * 8)); } if (b2 == 2) {//32xN int width = 2 * 2 * 8; int height = ImageUtil.CalcHeight(width, imageUZ.Length); return(ImageUtil.ByteToImage16Tile(width, height , imageUZ, 0 , Program.ROM.Data, (int)palette , 0 )); } else {//16xN int width = 2 * 8; int height = ImageUtil.CalcHeight(width, imageUZ.Length); return(ImageUtil.ByteToImage16Tile(width, height , imageUZ, 0 , Program.ROM.Data, (int)palette , 0 )); } }
public static Bitmap DrawWorldMapIcon(uint icon) { uint palette = Program.ROM.p32(Program.ROM.RomInfo.worldmap_icon_palette_pointer()); if (icon == 7 || icon == 8 || icon == 0xC) { uint image = Program.ROM.p32(Program.ROM.RomInfo.worldmap_icon2_pointer()); byte[] imageUZ = LZ77.decompress(Program.ROM.Data, image); int width = 8 * 12; int height = ImageUtil.CalcHeight(width, imageUZ.Length); Bitmap bitmap = ImageUtil.ByteToImage16Tile(width, height, imageUZ, 0, Program.ROM.Data, (int)palette); if (icon == 7) { return(ImageUtil.Copy(bitmap, 0, 0, 32, 32)); } if (icon == 8) { return(ImageUtil.Copy(bitmap, 32, 0, 32, 32)); } //0xC return(ImageUtil.Copy(bitmap, 64, 0, 32, 32)); } else if (icon <= 0x10) { uint image = Program.ROM.p32(Program.ROM.RomInfo.worldmap_icon1_pointer()); byte[] imageUZ = LZ77.decompress(Program.ROM.Data, image); int width = 8 * 32; int height = ImageUtil.CalcHeight(width, imageUZ.Length); Bitmap bitmap = ImageUtil.ByteToImage16Tile(width, height, imageUZ, 0, Program.ROM.Data, (int)palette); if (icon == 0) { return(ImageUtil.Copy(bitmap, 0, 0, 32, 32)); } if (icon == 1) { return(ImageUtil.Copy(bitmap, 32, 0, 32, 32)); } if (icon == 2 || icon == 3 || icon == 4) { return(ImageUtil.Copy(bitmap, 64, 0, 32, 32)); } if (icon == 5) { return(ImageUtil.Copy(bitmap, 144, 0, 16, 16)); } if (icon == 6) { return(ImageUtil.Copy(bitmap, 208, 0, 32, 32)); } if (icon == 9) { return(ImageUtil.Copy(bitmap, 192, 0, 16, 16)); } if (icon == 0xA) { return(ImageUtil.Copy(bitmap, 144, 16, 16, 16)); } if (icon == 0xB) { return(ImageUtil.Copy(bitmap, 160, 0, 16, 16)); } if (icon == 0xD) { return(ImageUtil.Copy(bitmap, 128, 0, 16, 32)); } if (icon == 0xE) { return(ImageUtil.Copy(bitmap, 96, 0, 32, 32)); } if (icon == 0xF) { return(ImageUtil.Copy(bitmap, 160, 16, 8, 8)); } if (icon == 0x10) { return(ImageUtil.Copy(bitmap, 144, 0, 16, 16)); } } return(ImageUtil.Blank(1, 1)); }
void ImportObjOnePicture(Bitmap loadbitmap) { const int palette_count = MAX_MAP_PALETTE_COUNT; int bitmap_palette_count = ImageUtil.GetPalette16Count(loadbitmap); if (bitmap_palette_count > palette_count) { R.ShowStopError("パレット数が正しくありません。\r\n{1}種類以下(16色*{1}種類) でなければなりません。\r\n\r\n選択された画像のパレット種類:{0}種類", bitmap_palette_count, palette_count); return; } if (loadbitmap.Width > 512 || loadbitmap.Height > 512 || loadbitmap.Width % 8 != 0) { R.ShowStopError("画像サイズが正しくありません。\r\nWidth:{2}以下 Height:{3}以下、でなければなりません。\r\nまた、幅は8で割り切れる必要があります。\r\n\r\n選択された画像のサイズ Width:{0} Height:{1}", loadbitmap.Width, loadbitmap.Height, 512, 512); return; } //マップチップ用に512x512のキャンバスに再描画 Bitmap bitmap = ImageUtil.Blank(512, 512, loadbitmap); ImageUtil.BitBlt(bitmap, 0, 0, loadbitmap.Width, loadbitmap.Height, loadbitmap, 0, 0); byte[] image; byte[] tsa; string error = ImageUtil.ImageToBytePackedTSA(bitmap, 512, 512, 0, out image, out tsa); if (error != "") { R.ShowStopError(error); return; } if (image.Length > 0x8000) { R.ShowStopError("マップが広すぎて、0x8000バイトに収まりませんでした。\r\n入力されたサイズ: {0}\r\n\r\nもっと小さいマップにするか、圧縮率を上げるために共通のパーツを増やしてください。", U.To0xHexString(image.Length)); return; } //写像した画像を再描画 byte[] palette_bin = ImageUtil.ImageToPalette(bitmap, 16); bitmap = ImageUtil.ByteToImage16Tile(256, 256, image, 0, palette_bin, 0); byte[] map_config = ImageUtilMap.ConvertTSAToMapConfig(tsa); //画像等データの書き込み Undo.UndoData undodata = Program.Undo.NewUndoData(this); bool r = WriteMapChipImage(image, undodata); if (!r) { return; } r = WriteMapChipPalette(bitmap, true, palette_count, undodata); if (!r) { return; } r = OverraideMapConfig(map_config, undodata); if (!r) { return; } Program.Undo.Push(undodata); MapStyle_SelectedIndexChanged(null, null); return; }
//FE6用 public static Bitmap DrawPortraitUnitFE6( uint unit_face , uint palette , uint mouth_x , uint mouth_y , int showFrame ) { int width = 12 * 8; int height = 10 * 8; unit_face = U.toOffset(unit_face); palette = U.toOffset(palette); if (unit_face == 0 || !U.isSafetyOffset(unit_face) || !U.isSafetyOffset(palette) ) { //ない. return(ImageUtil.Blank(width, height)); } //FE6の顔画像は圧縮されている. byte[] imageUZ = LZ77.decompress(Program.ROM.Data, unit_face); if (imageUZ.Length <= 0) {//ない return(ImageUtil.Blank(width, height)); } Bitmap allface = ImageUtil.ByteToImage16Tile(32 * 8, 5 * 8 , imageUZ, (int)0 , Program.ROM.Data, (int)palette ); //シートを作る Bitmap face = ImageUtil.Blank(face_width, face_height, allface); //メインの顔を転写 ImageUtil.BitBlt(face, parts_width / 2, 0 , parts_width * 2, parts_height * 2 , allface, 0, 0);//顔上 ImageUtil.BitBlt(face, parts_width / 2, parts_height * 2 , parts_width * 2, parts_height * 2 , allface, parts_width * 2, 0);//顔下 ImageUtil.BitBlt(face, parts_width / 2, parts_height * 4 , parts_width, parts_height , allface, parts_width * 4, 0);//右肩 ImageUtil.BitBlt(face, 0, parts_height * 3 , parts_width / 2, parts_height * 2 , allface, parts_width * 5, 0);//右端 ImageUtil.BitBlt(face, parts_width + parts_width / 2, parts_height * 4 , parts_width, parts_height , allface, parts_width * 4, parts_height);//左肩 ImageUtil.BitBlt(face, parts_width * 2 + parts_width / 2, parts_height * 3 , parts_width / 2, parts_height * 2 , allface, parts_width * 5 + parts_width / 2, 0);//左端 //表示フレーム指定 switch (showFrame) { case 1: //口ぱく1 ImageUtil.BitBlt(face, (int)mouth_x * 8, (int)mouth_y * 8, parts_width, parts_height , allface, 192, 0, 0, 0); break; case 2: //口ぱく2 ImageUtil.BitBlt(face, (int)mouth_x * 8, (int)mouth_y * 8, parts_width, parts_height , allface, 224, 0, 0, 0); break; case 3: //口ぱく3 ImageUtil.BitBlt(face, (int)mouth_x * 8, (int)mouth_y * 8, parts_width, parts_height , allface, 192, 16, 0, 0); break; case 4: //口ぱく4 ImageUtil.BitBlt(face, (int)mouth_x * 8, (int)mouth_y * 8, parts_width, parts_height , allface, 224, 16, 0, 0); break; case 5: //口ぱく5 ImageUtil.BitBlt(face, (int)mouth_x * 8, (int)mouth_y * 8, parts_width, parts_height / 2 , allface, 0, 32, 0, 0); ImageUtil.BitBlt(face, (int)mouth_x * 8, (int)mouth_y * 8 + (parts_height / 2), parts_width, parts_height / 2 , allface, 32, 32, 0, 0); break; default: break; } allface.Dispose(); return(face); }
//顔画像シートを作成する. public static Bitmap DrawPortraitSeetFE6(uint id) { InputFormRef InputFormRef = Init(null); //現在のIDに対応するデータ uint addr = InputFormRef.IDToAddr(id); if (!U.isSafetyOffset(addr)) { return(ImageUtil.BlankDummy()); } uint unit_face = Program.ROM.u32(addr); uint map_face = Program.ROM.u32(addr + 4); uint palette = Program.ROM.u32(addr + 8); if (unit_face == 0) { return(ImagePortraitForm.DrawPortraitClass(unit_face, palette)); } unit_face = U.toOffset(unit_face); palette = U.toOffset(palette); if (unit_face == 0 || !U.isSafetyOffset(unit_face) || !U.isSafetyOffset(palette) ) { //ない. return(ImageUtil.Blank(seet_width, seet_height)); } //FE6の顔画像は圧縮されている. byte[] imageUZ = LZ77.decompress(Program.ROM.Data, unit_face); if (imageUZ.Length <= 0) {//ない return(ImageUtil.Blank(seet_width, seet_height)); } Bitmap allface = ImageUtil.ByteToImage16Tile(32 * 8, 5 * 8 , imageUZ, (int)0 , Program.ROM.Data, (int)palette ); //シートを作る Bitmap seet = ImageUtil.Blank(seet_width, seet_height, allface); //メインの顔を転写 ImageUtil.BitBlt(seet, parts_width / 2, 0 , parts_width * 2, parts_height * 2 , allface, 0, 0);//顔上 ImageUtil.BitBlt(seet, parts_width / 2, parts_height * 2 , parts_width * 2, parts_height * 2 , allface, parts_width * 2, 0);//顔下 ImageUtil.BitBlt(seet, parts_width / 2, parts_height * 4 , parts_width, parts_height , allface, parts_width * 4, 0);//右肩 ImageUtil.BitBlt(seet, 0, parts_height * 3 , parts_width / 2, parts_height * 2 , allface, parts_width * 5, 0);//右端 ImageUtil.BitBlt(seet, parts_width + parts_width / 2, parts_height * 4 , parts_width, parts_height , allface, parts_width * 4, parts_height);//左肩 ImageUtil.BitBlt(seet, parts_width * 2 + parts_width / 2, parts_height * 3 , parts_width / 2, parts_height * 2 , allface, parts_width * 5 + parts_width / 2, 0);//左端 //マップ顔を描画 map_face = U.toOffset(map_face); Bitmap mapface_bitmap = ImageUtil.ByteToImage16Tile(mapface_width, mapface_height , Program.ROM.Data, (int)map_face , Program.ROM.Data, (int)palette , 0 ); //シートにマップ顔を転写 ImageUtil.BitBlt(seet, face_width, parts_height, mapface_width, mapface_height, mapface_bitmap, 0, 0); //口 いい具合に2*2と固まっているのでまとめてもっていく ImageUtil.BitBlt(seet, parts_width * 0, face_height, parts_width * 2, parts_height * 2, allface, (32 * 8) - (parts_width * 2), parts_height * 0); //右端の口 ImageUtil.BitBlt(seet, parts_width * 3, face_height, parts_width, parts_height / 2, allface, 0, 4 * 8); //余白 ImageUtil.BitBlt(seet, parts_width * 3, face_height + (parts_height / 2), parts_width, parts_height / 2, allface, 4 * 8, 4 * 8); return(seet); }