예제 #1
0
        void UpdateLZ77Info()
        {
            string error = "";
            string text  = "Un-LZ77 ";
            uint   frame = U.toOffset((uint)N_P16.Value);
            uint   oam   = U.toOffset((uint)N_P20.Value);

            if (U.isSafetyOffset(frame))
            {
                uint size = LZ77.getUncompressSize(Program.ROM.Data, frame);
                text += "Frame: " + size + " ";

                string r = ImageUtilOAM.checkFrameSizeSimple((int)size);
                if (r != "")
                {
                    error += r;
                }
            }
            if (U.isSafetyOffset(oam))
            {
                uint size = LZ77.getUncompressSize(Program.ROM.Data, oam);
                text += "OAM: " + size + " ";

                string r = ImageUtilOAM.checkOAMSizeSimple((int)size);
                if (r != "")
                {
                    error += r;
                }
            }

            X_LZ77_INFO.Text         = text;
            X_LZ77_INFO.ErrorMessage = error;
        }
예제 #2
0
        public static void MakeLZ77DataList(List <Address> list)
        {
            string name   = R._("圧縮データ");
            uint   length = (uint)Program.ROM.Data.Length - 4;

            for (uint addr = 0x100; addr < length; addr += 4)
            {
                uint a = (uint)Program.ROM.Data[addr + 3];
                if (a != 0x08 && a != 0x09)
                {//ポインタ以外無視する.
                    continue;
                }
                a = Program.ROM.p32(addr);
                if (!U.isSafetyOffset(a))
                {//危険なポインタは無視
                    continue;
                }
                if (a < Program.ROM.RomInfo.compress_image_borderline_address())
                {
                    continue;
                }

                //ポインタ先は圧縮されているか?
                uint imageDataSize = LZ77.getUncompressSize(Program.ROM.Data, a);
                if (IsBadImageSize(imageDataSize))
                {
                    continue;
                }

                //ポインタは連続してあらわれるのでそのチェックをする.
                if (!IsContinuousPointer(addr, length))
                {
                    continue;
                }

                //解凍して中身を見てみる.
                byte[] image = LZ77.decompress(Program.ROM.Data, a);
                if (image.Length != imageDataSize)
                {//解凍したらデータ容量が違う
                    continue;
                }
                uint getcompsize = LZ77.getCompressedSize(Program.ROM.Data, a);
                if (getcompsize == 0)
                {
                    continue;
                }

                //たぶん画像だと判断する.
                FEBuilderGBA.Address.AddAddress(list, a, getcompsize, addr, name + U.To0xHexString(a), Address.DataTypeEnum.LZ77IMG);
                if (InputFormRef.DoEvents(null, "MakeLZ77DataList " + U.ToHexString(addr)))
                {
                    return;
                }
            }
        }
        void UpdateLZ77Info(bool errorOver16Anime)
        {
            string error = "";
            string text  = "Un-LZ77 ";
            uint   frame = U.toOffset((uint)N_P16.Value);
            uint   oam   = U.toOffset((uint)N_P20.Value);

            if (U.isSafetyOffset(frame))
            {
                uint size = LZ77.getUncompressSize(Program.ROM.Data, frame);
                text += "Frame: " + size + " ";

                string r = ImageUtilOAM.checkFrameSizeSimple((int)size);
                if (r != "")
                {
                    error += r;
                }
            }
            if (U.isSafetyOffset(oam))
            {
                uint size = LZ77.getUncompressSize(Program.ROM.Data, oam);
                text += "OAM: " + size + " ";

                string r = ImageUtilOAM.checkOAMSizeSimple((int)size);
                if (r != "")
                {
                    error += r;
                }
            }
            if (error != "")
            {
                error = error + "\r\n" + R._("これは警告であり、エラーではありません。\r\n大きいアニメーションは動かないことがあるので警告を表示しています。\r\n警告が出ていても動作することもあります。");
            }

            if (errorOver16Anime)
            {
                text = R._("16色を超える戦闘アニメーションです。") + " " + text;
            }

            X_LZ77_INFO.Text         = text;
            X_LZ77_INFO.ErrorMessage = error;
        }
예제 #4
0
        uint RecompressOne(InputFormRef.AutoPleaseWait wait, Address a, Undo.UndoData undodata)
        {
            if (!Address.IsLZ77(a.DataType))
            {//念のためlz77圧縮の確認
                return(0);
            }
            if (!U.isPadding4(a.Addr))
            {//4バイトパディングされていないデータはありえない
                return(0);
            }

            byte[] unzipData = LZ77.decompress(Program.ROM.Data, a.Addr);
            if (unzipData.Length <= 0)
            {
                return(0);
            }
            uint uncompressSize = LZ77.getUncompressSize(Program.ROM.Data, a.Addr);

            if (unzipData.Length != uncompressSize)
            {
                return(0);
            }

            byte[] lz77Data = LZ77.compress(unzipData);
            if (lz77Data.Length >= a.Length)
            {//無意味なのでやらない
                return(0);
            }
            uint diff = (uint)(a.Length - lz77Data.Length);

            if (diff <= 3)
            {//無意味なのでやらない
                return(0);
            }
            //書き込み
            Program.ROM.write_fill(a.Addr, a.Length, 0, undodata);
            Program.ROM.write_range(a.Addr, lz77Data, undodata);
            wait.DoEvents(R._("recompress lz77 {0}", U.To0xHexString(a.Addr)));

            return(diff);
        }
예제 #5
0
        //TSAとパレットレコメンド
        void MakeTSAAndPaletteRecomend(uint image_address)
        {
            image_address = U.toOffset(image_address);

            TSA_Recomend.Items.Clear();
            PALETTE_Recomend.Items.Clear();

            uint image_pointer = refPointer(image_address);

            if (image_pointer == U.NOT_FOUND)
            {
                return;
            }
            //画像のサイズ
            uint imageDataSize = LZ77.getUncompressSize(Program.ROM.Data, image_address);

            if (imageDataSize <= 0)
            {
                imageDataSize = (uint)(PicWidth.Value * 8 * PicHeight.Value * 8);
            }

            //画像アドレスポインタ -0x100 ~ +0x100 の範囲を探索
            uint p = image_pointer - 0x100;

            if (!U.isSafetyOffset(p))
            {
                return;
            }

            uint end = image_pointer + 0x100;

            if (!U.isSafetyOffset(end))
            {
                end = (uint)Program.ROM.Data.Length;
            }

            TSA_Recomend.BeginUpdate();
            PALETTE_Recomend.BeginUpdate();

            TSA_Recomend.Items.Add("0(NONE)");
            PALETTE_Recomend.Items.Add("0(NONE)");

            for (; p < end; p += 4)
            {
                if (p == image_pointer)
                {//自分自身
                    continue;
                }
                uint a = Program.ROM.Data[p + 3];
                if (a != 0x08 && a != 0x09)
                {//探索を早くするため +3 がポインタマークでなければ切り捨て
                    continue;
                }

                a = U.p32(Program.ROM.Data, p);
                if (!U.isSafetyOffset(a))
                {//危険なポインタなので無視
                    continue;
                }
                if (a < Program.ROM.RomInfo.compress_image_borderline_address())
                {
                    continue;
                }

                uint unCompressSize = LZ77.getUncompressSize(Program.ROM.Data, a);
                if (unCompressSize > 0x10)
                {     //圧縮されている
                    if (unCompressSize >= 32 * 32 * 2)
                    { //TSAだとしても、大きすぎるため、没
                        continue;
                    }
                    //解凍して内容を確認する.
                    byte[] b = LZ77.decompress(Program.ROM.Data, a);
                    if (b.Length < unCompressSize)
                    {//偽圧縮データ
                        continue;
                    }

                    if (IsTSAData(b, 0, imageDataSize))
                    {//圧縮TSA
                        TSA_Recomend.Items.Add(U.ToHexString(a) + "(Z)");
                    }
                    else if (IsHeaderTSAData(b, 0, imageDataSize))
                    {//圧縮HEADERTSA
                        TSA_Recomend.Items.Add(U.ToHexString(a) + "(ZHEADER)");
                    }
//                    else if (IsPaletteMap(b,0))
//                    {//パレットマップ(worldmapにしかないので意味はないのだが..)
//                        TSA_Recomend.Items.Add(U.ToHexString(a) + "(PALMAP)");
//                    }
                    //無関係のデータなので無視
                    continue;
                }
                else
                {     //無圧縮データ
                    if (IsHeaderTSAData(Program.ROM.Data, a, imageDataSize))
                    { //無圧縮HEADERTSA
                        TSA_Recomend.Items.Add(U.ToHexString(a) + "(HEADER)");
                    }
                    else if (IsPalette(Program.ROM.Data, a))
                    {//パレットかなあ・・・ パレットの判別はできない。明らかに違うものをはじくだけ
                        PALETTE_Recomend.Items.Add(U.ToHexString(a));
                    }
                }
            }
            PALETTE_Recomend.EndUpdate();
            TSA_Recomend.EndUpdate();

            //パレットは誤っていも問題ないので、選択してみる
            if (!U.SelectedIndexSafety(PALETTE_Recomend, 1, false))
            {
                U.SelectedIndexSafety(PALETTE_Recomend, 0, false);
            }
            //TSAは間違っているとまずいので無選択
            U.SelectedIndexSafety(TSA_Recomend, 0, false);
        }
예제 #6
0
        public static List <FoundImage> FindImage()
        {
            //誤爆すると面倒なことになるフレームとOAMのデータ群
            Dictionary <uint, bool> battleFrameDic = new Dictionary <uint, bool>();

            ImageBattleAnimeForm.MakeBattleFrameAndOAMDictionary(battleFrameDic);

            List <FoundImage> list = new List <FoundImage>();
            uint length            = (uint)Program.ROM.Data.Length - 4;

            for (uint addr = 0x100; addr < length; addr += 4)
            {
                uint a = (uint)Program.ROM.Data[addr + 3];
                if (a != 0x08 && a != 0x09)
                {//ポインタ以外無視する.
                    continue;
                }

                a = Program.ROM.p32(addr);
                if (!U.isSafetyOffset(a))
                {//危険なポインタは無視
                    continue;
                }

                if (a < Program.ROM.RomInfo.compress_image_borderline_address())
                {
                    continue;
                }

                if (battleFrameDic.ContainsKey(a))
                {//戦闘アニメのフレーム,OAM等のlz77で圧縮されているデータ
                    continue;
                }

                //ポインタ先は圧縮されているか?
                uint imageDataSize = LZ77.getUncompressSize(Program.ROM.Data, a);
                if (IsBadImageSize(imageDataSize))
                {
                    continue;
                }

                //ポインタは連続してあらわれるのでそのチェックをする.
                if (!IsContinuousPointer(addr, length))
                {
                    continue;
                }

                //ポインタ先をすでに知っている場合は無視.
                if (IsAlrealyFoundImage(list, a))
                {
                    continue;
                }

                //解凍して中身を見てみる.
                byte[] image = LZ77.decompress(Program.ROM.Data, a);
                if (image.Length != imageDataSize)
                {//解凍したらデータ容量が違う
                    continue;
                }
//                if (IsTSAData(image, 0, imageDataSize))
//                {
//                    continue;
//                }
//                if (IsHeaderTSAData(image, 0, imageDataSize))
//                {
//                    continue;
//                }
                //たぶん画像だと判断する.
                list.Add(new FoundImage(addr, a, imageDataSize));
            }
            return(list);
        }
예제 #7
0
        public static List <FoundImage> FindImage()
        {
            List <FoundImage> list = new List <FoundImage>();
            uint length            = (uint)Program.ROM.Data.Length - 4;

            for (uint addr = 0x100; addr < length; addr += 4)
            {
                uint a = (uint)Program.ROM.Data[addr + 3];
                if (a != 0x08 && a != 0x09)
                {//ポインタ以外無視する.
                    continue;
                }

                a = Program.ROM.p32(addr);
                if (!U.isSafetyOffset(a))
                {//危険なポインタは無視
                    continue;
                }

                if (a < Program.ROM.RomInfo.compress_image_borderline_address())
                {
                    continue;
                }

                //ポインタ先は圧縮されているか?
                uint imageDataSize = LZ77.getUncompressSize(Program.ROM.Data, a);
                if (IsBadImageSize(imageDataSize))
                {
                    continue;
                }

                //ポインタは連続してあらわれるのでそのチェックをする.
                if (!IsContinuousPointer(addr, length))
                {
                    continue;
                }

                //ポインタ先をすでに知っている場合は無視.
                if (IsAlrealyFoundImage(list, a))
                {
                    continue;
                }

                //解凍して中身を見てみる.
                byte[] image = LZ77.decompress(Program.ROM.Data, a);
                if (image.Length != imageDataSize)
                {//解凍したらデータ容量が違う
                    continue;
                }
                if (IsTSAData(image, 0, imageDataSize))
                {
                    continue;
                }
                if (IsHeaderTSAData(image, 0, imageDataSize))
                {
                    continue;
                }
                //たぶん画像だと判断する.
                list.Add(new FoundImage(addr, a, imageDataSize));
            }
            return(list);
        }
예제 #8
0
        public static void MakeLZ77DataList(List <Address> list)
        {
            //誤爆すると面倒なことになるフレームとOAMのデータ群
            Dictionary <uint, bool> ignoreDic = new Dictionary <uint, bool>();

            ImageBattleAnimeForm.MakeBattleFrameAndOAMDictionary(ignoreDic);
            SoundFootStepsForm.MakeIgnoreDictionary(ignoreDic);
            WorldMapPointForm.MakeIgnoreDictionary(ignoreDic);
            MakeIgnoreDictionnaryFromList(ignoreDic, list);

            string name   = R._("圧縮データ");
            uint   length = (uint)Program.ROM.Data.Length - 4;

            for (uint addr = 0x100; addr < length; addr += 4)
            {
                uint a = (uint)Program.ROM.Data[addr + 3];
                if (a != 0x08 && a != 0x09)
                {//ポインタ以外無視する.
                    continue;
                }
                a = Program.ROM.p32(addr);
                if (!U.isSafetyOffset(a))
                {//危険なポインタは無視
                    continue;
                }
                if (a < Program.ROM.RomInfo.compress_image_borderline_address)
                {
                    continue;
                }
                if (!U.isPadding4(a))
                {//4バイトパディングされていないlz77データはありえないとする.
                    continue;
                }

                if (ignoreDic.ContainsKey(a))
                {//戦闘アニメのフレーム,OAM等のlz77で圧縮されているデータ
                    continue;
                }

                //ポインタ先は圧縮されているか?
                uint imageDataSize = LZ77.getUncompressSize(Program.ROM.Data, a);
                if (IsBadImageSize(imageDataSize))
                {
                    continue;
                }

                //ポインタは連続してあらわれるのでそのチェックをする.
                if (!IsContinuousPointer(addr, length))
                {
                    continue;
                }

                uint getcompsize = LZ77.getCompressedSize(Program.ROM.Data, a);
                if (getcompsize == 0)
                {
                    continue;
                }

                //たぶん画像だと判断する.
                FEBuilderGBA.Address.AddAddress(list, a, getcompsize, addr, name + U.To0xHexString(a), Address.DataTypeEnum.LZ77IMG);
                if (InputFormRef.DoEvents(null, "MakeLZ77DataList " + U.ToHexString(addr)))
                {
                    return;
                }
            }
        }