Exemplo n.º 1
0
        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
                                               ));
        }
Exemplo n.º 2
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
                                               ));
        }
Exemplo n.º 3
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);
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
        //音楽系の下絵
        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);
        }
Exemplo n.º 7
0
        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
                                               ));
        }
Exemplo n.º 8
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)
                                               ));
        }
Exemplo n.º 9
0
        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));
        }
Exemplo n.º 10
0
        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)
                                               ));
        }
Exemplo n.º 11
0
        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)));
        }
Exemplo n.º 12
0
        //下絵の取得
        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);
        }
Exemplo n.º 13
0
        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
                                               ));
        }
Exemplo n.º 14
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
                                               ));
        }
Exemplo n.º 15
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));
        }
Exemplo n.º 16
0
        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);
        }
Exemplo n.º 17
0
        //武器の下絵
        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);
        }
Exemplo n.º 18
0
        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);
        }
Exemplo n.º 20
0
        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);
        }
Exemplo n.º 21
0
        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);
        }
Exemplo n.º 24
0
        //マップチップだけを描画する
        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);
        }
Exemplo n.º 25
0
        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
                                                   ));
            }
        }
Exemplo n.º 27
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));
        }
Exemplo n.º 28
0
        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;
        }
Exemplo n.º 29
0
        //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);
        }
Exemplo n.º 30
0
        //顔画像シートを作成する.
        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);
        }