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