static public void AddLZ77Address(List <Address> list, uint addr, uint pointer, string info, bool isPointerOnly, DataTypeEnum type) { addr = U.toOffset(addr); if (!U.isSafetyOffset(addr)) { return; } if (pointer != U.NOT_FOUND) { pointer = U.toOffset(pointer); if (!U.isSafetyOffset(pointer)) { return; } } uint length; if (isPointerOnly) { length = 0; } else { length = LZ77.getCompressedSize(Program.ROM.Data, addr); } list.Add(new Address(addr, length, pointer, info, type)); }
//全データの取得 public static void MakeAllDataLength(List <Address> list, bool isPointerOnly) { string name = "OPClassFont"; { InputFormRef InputFormRef = Init(null); FEBuilderGBA.Address.AddAddress(list, InputFormRef, name, new uint[] { 0 }); uint p = InputFormRef.BaseAddress; for (int i = 0; i < InputFormRef.DataCount; i++, p += InputFormRef.BlockSize) { name = "OPClassFont " + U.To0xHexString(i); uint a = Program.ROM.p32(p); if (a <= 0) { continue; } uint length = LZ77.getCompressedSize(Program.ROM.Data, a); FEBuilderGBA.Address.AddLZ77Pointer(list , p , name , isPointerOnly , FEBuilderGBA.Address.DataTypeEnum.LZ77IMG); } } }
//全データの取得 public static void MakeAllDataLength(List <Address> list, bool isPointerOnly) { string selfname = "BattleBG"; InputFormRef InputFormRef = Init(null); FEBuilderGBA.Address.AddAddress(list, InputFormRef, selfname, new uint[] { 0, 4, 8 }); uint p = InputFormRef.BaseAddress; for (int i = 0; i < InputFormRef.DataCount; i++, p += InputFormRef.BlockSize) { selfname = "BattleBG " + U.To0xHexString(i); uint image = Program.ROM.p32(0 + p); FEBuilderGBA.Address.AddAddress(list, image , isPointerOnly ? 0 : LZ77.getCompressedSize(Program.ROM.Data, image) , p + 0 , selfname , FEBuilderGBA.Address.DataTypeEnum.LZ77IMG); uint tsa = Program.ROM.p32(4 + p); FEBuilderGBA.Address.AddAddress(list, tsa , isPointerOnly ? 0 : LZ77.getCompressedSize(Program.ROM.Data, tsa) , p + 4 , selfname , FEBuilderGBA.Address.DataTypeEnum.LZ77TSA); uint palette = Program.ROM.p32(8 + p); FEBuilderGBA.Address.AddAddress(list, palette , isPointerOnly ? 0 : LZ77.getCompressedSize(Program.ROM.Data, palette) , p + 8 , selfname , FEBuilderGBA.Address.DataTypeEnum.LZ77PAL); } }
//圧縮されているデータをそのまま取得する public static byte[] GetCompressDataLow(byte[] input, uint offset) { uint image_size = LZ77.getCompressedSize(input, offset); if (image_size <= 0) { return(new byte[0]); } return(U.getBinaryData(input, offset, image_size)); }
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; } } }
//マップ領域のベース領域の強制割り当て public static uint PreciseMapDataArea(uint mapid) { MapPointerNewPLISTPopupForm f = (MapPointerNewPLISTPopupForm)InputFormRef.JumpFormLow <MapPointerNewPLISTPopupForm>(); f.Init(MapPointerForm.PLIST_TYPE.MAP); DialogResult dr = f.ShowDialog(); if (dr != System.Windows.Forms.DialogResult.OK) { return(0); } uint plist = f.GetSelectPLIST(); Undo.UndoData undodata = Program.Undo.NewUndoData("Precise MapDataArea", mapid.ToString("X")); //マップ領域を新規に割り当てる byte[] data = new byte[2 + (15 * 10)]; data[0] = 15; data[1] = 10; data = LZ77.compress(data); MapSettingForm.PLists plists = MapSettingForm.GetMapPListsWhereMapID(mapid); uint map_addr = MapPointerForm.PlistToOffsetAddr(MapPointerForm.PLIST_TYPE.MAP, plists.mappointer_plist); if (U.isSafetyOffset(map_addr)) {//既存マップがあればコピーする. uint length = LZ77.getCompressedSize(Program.ROM.Data, map_addr); data = Program.ROM.getBinaryData(map_addr, length); } uint write_addr = InputFormRef.AppendBinaryData(data, undodata); if (write_addr == U.NOT_FOUND) { Program.Undo.Rollback(undodata); return(0); } bool r = MapPointerForm.Write_Plsit(MapPointerForm.PLIST_TYPE.MAP, plist, write_addr, undodata); if (!r) { Program.Undo.Rollback(undodata); return(0); } Program.Undo.Push(undodata); return(plist); }
static uint All_ToolAutoGenLeftToRightAllAnimation(InputFormRef.AutoPleaseWait pleaseWait, Undo.UndoData undodata) { uint totalSize = 0; //テーブル拡張などで同じOAMが複数個所にある場合の対処 Dictionary <uint, uint> convertHistory = new Dictionary <uint, uint>(); InputFormRef N_InputFormRef = N_Init(null); uint addr = N_InputFormRef.BaseAddress; for (uint i = 0; i < N_InputFormRef.DataCount; i++, addr += N_InputFormRef.BlockSize) { uint rightToLeftOAMAddress = Program.ROM.p32(addr + 20); uint leftToRightOAMAddress = Program.ROM.p32(addr + 24); if (rightToLeftOAMAddress == leftToRightOAMAddress) {//処理済み continue; } //実はさっき処理していますか? //D拡張などで同じデータが複数個ある場合への配慮. uint convertAddress; if (convertHistory.TryGetValue(leftToRightOAMAddress, out convertAddress)) { Program.ROM.write_p32(addr + 24, convertAddress, undodata); continue; } byte[] rightToLeftOAMBin = LZ77.decompress(Program.ROM.Data, rightToLeftOAMAddress); byte[] leftToRightOAMBin = LZ77.decompress(Program.ROM.Data, leftToRightOAMAddress); List <byte> rightToLeftOAMArray = new List <byte>(rightToLeftOAMBin); List <byte> leftToRightOAMArray = new List <byte>(leftToRightOAMBin); if (!ImageUtilOAM.IsMatchOAM(rightToLeftOAMArray, leftToRightOAMArray)) {//鏡写しではないので、自動生成できません。 continue; } pleaseWait.DoEvents(R._("{0} 削減サイズ:{1}", U.To0xHexString(i), totalSize)); //データを自動生成できるので、ポインタを共有します Program.ROM.write_p32(addr + 24, rightToLeftOAMAddress, undodata); //不要なデータを消去します uint leftToRightOAMSize = LZ77.getCompressedSize(Program.ROM.Data, leftToRightOAMAddress); Program.ROM.write_fill(leftToRightOAMAddress, leftToRightOAMSize, 0, undodata); convertHistory[leftToRightOAMAddress] = rightToLeftOAMAddress; totalSize += leftToRightOAMSize; } return(totalSize); }
void TypeToLengthAndName(AsmMapSt p, uint pointer, ROM rom) { string type = p.TypeName; if (type == "LZ77") { p.Length = LZ77.getCompressedSize(rom.Data, U.toOffset(pointer)); } else if (type == "OAMREGS") { p.Length = U.OAMREGSLength(U.toOffset(pointer), rom); p.Name += " Count_" + ((p.Length - 2) / (3 * 2)); } else if (type == "OAMREGS_ARRAY") { p.Length = ScanOAMREGSTable(pointer, p.Name, rom); } else if (type == "TEXTBATCH") { p.Length = U.TextBatchLength(U.toOffset(pointer), rom); p.Name += " Count_" + ((p.Length) / 8); } else if (type == "TEXTBATCHSHORT") { p.Length = U.TextBatchShortLength(U.toOffset(pointer), rom); p.Name += " Count_" + ((p.Length) / 2); } else if (type == "EVENT") { p.Length = EventScript.SearchEveneLength(rom.Data, U.toOffset(pointer)); p.Name += " Count_" + ((p.Length - 2) / (3 * 2)); } else if (type == "HEADERTSA") { p.Length = ImageUtil.CalcByteLengthForHeaderTSAData(rom.Data, (int)U.toOffset(pointer)); } else if (type == "ROMPALETTEANIMEFRAME") { p.Length = ImageRomAnimeForm.GetPaletteFrameCountLow(rom.Data, U.toOffset(pointer)) * 2; } else if (type == "PALETTE") { p.Length = 0x20; } else if (type == "PALETTE2") { p.Length = 0x20 * 2; } else if (type == "PALETTE3") { p.Length = 0x20 * 3; } else if (type == "PALETTE4") { p.Length = 0x20 * 4; } else if (type == "PALETTE8") { p.Length = 0x20 * 8; } else if (type == "PALETTE7") { p.Length = 0x20 * 7; } else if (type == "PALETTE16") { p.Length = 0x20 * 16; } else if (type == "ROMTCS") { p.Length = ImageUtilAP.CalcROMTCSLength(U.toOffset(pointer), rom); } else if (type == "NAZO60") { p.Length = 60; } else if (type == "FONTCOLOR0x200") { p.Length = 0x200; } else if (type == "NewPopupSimple") { p.Length = ImageUtilAP.CalcPopupSimpleLength(U.toOffset(pointer), rom); } else if (type == "SECONDARYOAM") { p.Length = 14; } else if (type == "SECONDARYOAM_ARRAY") { p.Length = ScanSECONDARYOAMTable(pointer, p.Name, rom); } else if (type == "CSTRING") { int length; string strname = rom.getString(U.toOffset(pointer), out length); p.Length = (uint)length; p.Name += " => " + strname; } else if (type == "SOUND_85COMMAND_POINTER_ARRAY") { p.Length = ScanSOUND85COMMANDPointerTable(pointer, p.Name, rom); } else if (type == "ASM_POINTER_ARRAY") { p.Length = ScanASMPointerTable(pointer, p.Name, rom); } else if (type == "PROC") { uint length = ProcsScriptForm.CalcLengthAndCheck(U.toOffset(pointer)); if (length != U.NOT_FOUND) { p.Length = length; } } else if (type == "NAZO8_DATA_POINTER_ARRAY") { p.Length = ScanNazo8DataPointerTable(pointer, p.Name, rom); } else if (type == "ASM") { p.Length = 0; } else if (type == "BGCONFIG") { p.Length = 10 * 2; } }
//全データの取得 public static void MakeAllDataLength(List <Address> list, bool isPointerOnly) { uint image, palette, tsa; image = Program.ROM.p32(Program.ROM.RomInfo.system_icon_pointer()); palette = Program.ROM.p32(Program.ROM.RomInfo.system_icon_palette_pointer()); FEBuilderGBA.Address.AddAddress(list, image , isPointerOnly ? 0 : LZ77.getCompressedSize(Program.ROM.Data, image) , Program.ROM.RomInfo.system_icon_pointer() , "system_icon image" , Address.DataTypeEnum.LZ77IMG); FEBuilderGBA.Address.AddAddress(list, palette , 0x20 * 2 , Program.ROM.RomInfo.system_icon_palette_pointer() , "system_icon pal" , Address.DataTypeEnum.PAL); image = Program.ROM.p32(Program.ROM.RomInfo.system_move_allowicon_pointer()); palette = Program.ROM.p32(Program.ROM.RomInfo.system_move_allowicon_palette_pointer()); FEBuilderGBA.Address.AddAddress(list, image , isPointerOnly ? 0 : LZ77.getCompressedSize(Program.ROM.Data, image) , Program.ROM.RomInfo.system_move_allowicon_pointer() , "system_icon image" , Address.DataTypeEnum.LZ77IMG); FEBuilderGBA.Address.AddAddress(list, palette , 0x20 , Program.ROM.RomInfo.system_move_allowicon_palette_pointer() , "system_move_allowicon pal" , Address.DataTypeEnum.LZ77PAL); image = Program.ROM.p32(Program.ROM.RomInfo.system_weapon_icon_pointer()); palette = Program.ROM.p32(Program.ROM.RomInfo.system_weapon_icon_palette_pointer()); FEBuilderGBA.Address.AddAddress(list, image , isPointerOnly ? 0 : LZ77.getCompressedSize(Program.ROM.Data, image) , Program.ROM.RomInfo.system_weapon_icon_pointer() , "system_weapon image" , Address.DataTypeEnum.LZ77IMG); FEBuilderGBA.Address.AddAddress(list, palette , 0x20 , Program.ROM.RomInfo.system_weapon_icon_palette_pointer() , "system_weapon pal" , Address.DataTypeEnum.PAL); image = Program.ROM.p32(Program.ROM.RomInfo.system_music_icon_pointer()); palette = Program.ROM.p32(Program.ROM.RomInfo.system_music_icon_palette_pointer()); FEBuilderGBA.Address.AddAddress(list, image , isPointerOnly ? 0 : LZ77.getCompressedSize(Program.ROM.Data, image) , Program.ROM.RomInfo.system_music_icon_pointer() , "system_music image" , Address.DataTypeEnum.LZ77IMG); FEBuilderGBA.Address.AddAddress(list, palette , 0x20 , Program.ROM.RomInfo.system_music_icon_palette_pointer() , "system_music pal" , Address.DataTypeEnum.PAL); palette = (Program.ROM.RomInfo.unit_icon_palette_address()); FEBuilderGBA.Address.AddAddress(list, palette , 0x20 , U.NOT_FOUND , "unit_icon_play pal" , Address.DataTypeEnum.PAL); palette = (Program.ROM.RomInfo.unit_icon_enemey_palette_address()); FEBuilderGBA.Address.AddAddress(list, palette , 0x20 , U.NOT_FOUND , "unit_icon_enemey pal" , Address.DataTypeEnum.PAL); palette = (Program.ROM.RomInfo.unit_icon_npc_palette_address()); FEBuilderGBA.Address.AddAddress(list, palette , 0x20 , U.NOT_FOUND , "unit_icon_npc pal" , Address.DataTypeEnum.PAL); palette = (Program.ROM.RomInfo.unit_icon_gray_palette_address()); FEBuilderGBA.Address.AddAddress(list, palette , 0x20 , U.NOT_FOUND , "unit_icon_gray pal" , Address.DataTypeEnum.PAL); palette = (Program.ROM.RomInfo.unit_icon_four_palette_address()); FEBuilderGBA.Address.AddAddress(list, palette , 0x20 , U.NOT_FOUND , "unit_icon_for pal" , Address.DataTypeEnum.PAL); if (Program.ROM.RomInfo.version() >= 7) { image = Program.ROM.p32(Program.ROM.RomInfo.systemmenu_common_image_pointer()); palette = Program.ROM.p32(Program.ROM.RomInfo.systemmenu_common_palette_pointer()); FEBuilderGBA.Address.AddAddress(list, image , isPointerOnly ? 0 : LZ77.getCompressedSize(Program.ROM.Data, image) , Program.ROM.RomInfo.systemmenu_common_image_pointer() , "systemmenu_goal image" , Address.DataTypeEnum.LZ77IMG); FEBuilderGBA.Address.AddHeaderTSAPointer(list , Program.ROM.RomInfo.systemmenu_goal_tsa_pointer() , "systemmenu_goal tsa", isPointerOnly ); FEBuilderGBA.Address.AddAddress(list, palette , 0x20 * 4 , Program.ROM.RomInfo.systemmenu_common_palette_pointer() , "systemmenu_goal pal" , Address.DataTypeEnum.PAL); } image = Program.ROM.p32(Program.ROM.RomInfo.systemmenu_common_image_pointer()); tsa = Program.ROM.p32(Program.ROM.RomInfo.systemmenu_terrain_tsa_pointer()); palette = Program.ROM.p32(Program.ROM.RomInfo.systemmenu_common_palette_pointer()); FEBuilderGBA.Address.AddAddress(list, image , isPointerOnly ? 0 : LZ77.getCompressedSize(Program.ROM.Data, image) , Program.ROM.RomInfo.systemmenu_common_image_pointer() , "systemmenu_common image" , Address.DataTypeEnum.LZ77IMG); FEBuilderGBA.Address.AddHeaderTSAPointer(list , Program.ROM.RomInfo.systemmenu_terrain_tsa_pointer() , "systemmenu_common tsa", isPointerOnly); FEBuilderGBA.Address.AddAddress(list, palette , 0x20 * 4 , Program.ROM.RomInfo.systemmenu_common_palette_pointer() , "systemmenu_common" , Address.DataTypeEnum.LZ77IMG); FEBuilderGBA.Address.AddHeaderTSAPointer(list , Program.ROM.RomInfo.systemmenu_name_tsa_pointer() , "systemmenu_name tsa", isPointerOnly); image = Program.ROM.p32(Program.ROM.RomInfo.systemmenu_battlepreview_image_pointer()); palette = Program.ROM.p32(Program.ROM.RomInfo.systemmenu_battlepreview_palette_pointer()); FEBuilderGBA.Address.AddAddress(list, image , isPointerOnly ? 0 : LZ77.getCompressedSize(Program.ROM.Data, image) , Program.ROM.RomInfo.systemmenu_battlepreview_image_pointer() , "systemmenu_battlepreview image" , Address.DataTypeEnum.LZ77IMG); FEBuilderGBA.Address.AddHeaderTSAPointer(list , Program.ROM.RomInfo.systemmenu_battlepreview_tsa_pointer() , "systemmenu_battlepreview tsa", isPointerOnly); FEBuilderGBA.Address.AddAddress(list, palette , 0x20 * 4 , Program.ROM.RomInfo.systemmenu_battlepreview_palette_pointer() , "systemmenu_battlepreview pal" , Address.DataTypeEnum.PAL); if (Program.ROM.RomInfo.version() == 8) {//FE8の場合、画像イメージは4つのポインタがあります。 uint other_image_p = Program.ROM.RomInfo.systemmenu_battlepreview_image_pointer(); FEBuilderGBA.Address.AddLZ77Pointer(list, other_image_p + 4, "systemmenu_battlepreview_enemy", isPointerOnly, Address.DataTypeEnum.LZ77IMG); FEBuilderGBA.Address.AddLZ77Pointer(list, other_image_p + 8, "systemmenu_battlepreview_npc", isPointerOnly, Address.DataTypeEnum.LZ77IMG); FEBuilderGBA.Address.AddLZ77Pointer(list, other_image_p + 12, "systemmenu_battlepreview_4th", isPointerOnly, Address.DataTypeEnum.LZ77IMG); } palette = Program.ROM.p32(Program.ROM.RomInfo.systemarea_move_gradation_palette_pointer()); FEBuilderGBA.Address.AddAddress(list, palette , 0x20 * 3 , Program.ROM.RomInfo.systemarea_move_gradation_palette_pointer() , "systemarea_move_gradation" , Address.DataTypeEnum.PAL); palette = Program.ROM.p32(Program.ROM.RomInfo.systemarea_attack_gradation_palette_pointer()); FEBuilderGBA.Address.AddAddress(list, palette , 0x20 * 3 , Program.ROM.RomInfo.systemarea_attack_gradation_palette_pointer() , "systemarea_attack_gradation" , Address.DataTypeEnum.PAL); palette = Program.ROM.p32(Program.ROM.RomInfo.systemarea_staff_gradation_palette_pointer()); FEBuilderGBA.Address.AddAddress(list, palette , 0x20 * 3 , Program.ROM.RomInfo.systemarea_staff_gradation_palette_pointer() , "systemarea_staff_gradation" , Address.DataTypeEnum.PAL); if (Program.ROM.RomInfo.version() >= 8) {//FE8 image = Program.ROM.p32(Program.ROM.RomInfo.systemmenu_badstatus_image_pointer()); FEBuilderGBA.Address.AddAddress(list, image , 40 * (8 * 9) / 2 , Program.ROM.RomInfo.systemmenu_badstatus_image_pointer() , "systemmenu_badstatus" , Address.DataTypeEnum.LZ77IMG); } else if (Program.ROM.RomInfo.version() >= 7) {//FE7 image = Program.ROM.p32(Program.ROM.RomInfo.systemmenu_badstatus_image_pointer()); FEBuilderGBA.Address.AddAddress(list, image , 40 * (8 * 4) / 2 , Program.ROM.RomInfo.systemmenu_badstatus_image_pointer() , "systemmenu_badstatus" , Address.DataTypeEnum.LZ77IMG); } else {//FE6 } palette = Program.ROM.p32(Program.ROM.RomInfo.systemmenu_badstatus_palette_pointer()); FEBuilderGBA.Address.AddAddress(list, palette , 0x20 , Program.ROM.RomInfo.systemmenu_badstatus_palette_pointer() , "systemmenu_badstatus_palette" , Address.DataTypeEnum.PAL); FEBuilderGBA.Address.AddHeaderTSAPointer(list , Program.ROM.RomInfo.system_tsa_16color_304x240_pointer() , "system_tsa_16color_304x240", isPointerOnly); }
//全データの取得 public static void MakeAllDataLength(List <Address> list, bool isPointerOnly) { foreach (var pair in g_ROMAnime) { string[] sp = pair.Value; int imageWidth = (int)U.atoi(U.at(sp, 0)); string option = U.at(sp, 1); uint framePointer = U.atoh(U.at(sp, 2)); uint tsaPointer = U.atoh(U.at(sp, 3)); uint imagePointer = U.atoh(U.at(sp, 4)); uint palettePointer = U.atoh(U.at(sp, 5)); string name = U.at(sp, 6); uint frameCount = U.NOT_FOUND; if (U.isSafetyOffset(framePointer)) { FEBuilderGBA.Address.AddAddress(list, framePointer , 4 , U.NOT_FOUND , name + " FRAME Pointer" , FEBuilderGBA.Address.DataTypeEnum.POINTER); if (!isPointerOnly) { frameCount = GetFrameCountLow(framePointer); if (frameCount != U.NOT_FOUND) { uint p = Program.ROM.p32(framePointer); FEBuilderGBA.Address.AddAddress(list, p , frameCount * 4 , framePointer , name + " FRAME" , FEBuilderGBA.Address.DataTypeEnum.BIN); } } } if (frameCount == U.NOT_FOUND) { continue; } FEBuilderGBA.Address.AddAddress(list, tsaPointer , 4 , U.NOT_FOUND , name + " TSA Pointer" , FEBuilderGBA.Address.DataTypeEnum.POINTER); if (!isPointerOnly) { List <uint> tsaList = GetPointerListCount(tsaPointer); uint baseAddr = Program.ROM.p32(tsaPointer); for (int i = 0; i < tsaList.Count; i++) { uint p = baseAddr + ((uint)i * 4); uint a = tsaList[i]; if (Program.ROM.p32(p) != a) { p = U.NOT_FOUND; } FEBuilderGBA.Address.AddAddress(list, a , isPointerOnly ? 0 : LZ77.getCompressedSize(Program.ROM.Data, a) , p , name + " TSA" , FEBuilderGBA.Address.DataTypeEnum.LZ77TSA); } } FEBuilderGBA.Address.AddAddress(list, imagePointer , 4 , U.NOT_FOUND , name + " Image Pointer" , FEBuilderGBA.Address.DataTypeEnum.POINTER); if (!isPointerOnly) { List <uint> imageList = GetPointerListCount(imagePointer); uint baseAddr = Program.ROM.p32(imagePointer); for (int i = 0; i < imageList.Count; i++) { uint p = baseAddr + ((uint)i * 4); uint a = imageList[i]; if (Program.ROM.p32(p) != a) { p = U.NOT_FOUND; } FEBuilderGBA.Address.AddAddress(list, a , isPointerOnly ? 0 : LZ77.getCompressedSize(Program.ROM.Data, a) , p , name + " Image" , FEBuilderGBA.Address.DataTypeEnum.LZ77IMG); } } FEBuilderGBA.Address.AddAddress(list, palettePointer , 4 , U.NOT_FOUND , name + " Palette Pointer" , FEBuilderGBA.Address.DataTypeEnum.POINTER); if (!isPointerOnly) { List <uint> paletteList = GetPalettePointerListCount(palettePointer, framePointer, option); uint baseAddr = Program.ROM.p32(palettePointer); for (int i = 0; i < paletteList.Count; i++) { uint p = baseAddr + ((uint)i * 4); uint a = paletteList[i]; if (Program.ROM.p32(p) != a) { p = U.NOT_FOUND; } FEBuilderGBA.Address.AddAddress(list, a , 2 * 16 , p , name + " Palette" , FEBuilderGBA.Address.DataTypeEnum.PAL); } } } }
void MakeRecycleList(ref List <Address> recycle, string basename, bool isPointerOnly) { if (!U.isSafetyOffset(this.FramePointer)) { for (int i = 0; i < this.FramePointer; i++) { if (this.TSAList.Count > 0) { uint tsa; if (i >= this.TSAList.Count) { tsa = this.TSAList[this.TSAList.Count - 1]; } else { tsa = this.TSAList[i]; } FEBuilderGBA.Address.AddAddress(recycle , tsa , isPointerOnly ? 0 : LZ77.getCompressedSize(Program.ROM.Data, tsa) , U.NOT_FOUND , basename + "TSA" , FEBuilderGBA.Address.DataTypeEnum.LZ77TSA); } if (this.ImageList.Count > 0) { uint image; if (i >= this.ImageList.Count) { image = this.ImageList[this.ImageList.Count - 1]; } else { image = this.ImageList[i]; } FEBuilderGBA.Address.AddAddress(recycle , image , isPointerOnly ? 0 : LZ77.getCompressedSize(Program.ROM.Data, image) , U.NOT_FOUND , basename + "IMAGE" , FEBuilderGBA.Address.DataTypeEnum.LZ77TSA); } if (this.PaletteList.Count > 0) { uint palette; if (i >= this.PaletteList.Count) { palette = this.PaletteList[this.PaletteList.Count - 1]; } else { palette = this.PaletteList[i]; } FEBuilderGBA.Address.AddAddress(recycle , palette , 2 * 16 , U.NOT_FOUND , basename + "PAL" , FEBuilderGBA.Address.DataTypeEnum.PAL); } } } else { //同じアニメを何度も出力しないように記録する. Dictionary <uint, bool> animeHash = new Dictionary <uint, bool>(); uint addr = Program.ROM.p32(FramePointer); uint startAddr = addr; //圧縮されていないデータなので、事故防止のため リミッターをかける. uint limitter = addr + 1024 * 1024; //1MBサーチしたらもうあきらめる. limitter = (uint)Math.Min(limitter, Program.ROM.Data.Length); uint id = 0; uint wait = 0; for (; addr < limitter; addr += 4) { id = Program.ROM.u16(addr); wait = Program.ROM.u16(addr + 2); if (id == 0xFFFF) { break; } int i = (int)id; if (this.TSAList.Count > 0) { uint tsa; if (i >= this.TSAList.Count) { tsa = this.TSAList[this.TSAList.Count - 1]; } else { tsa = this.TSAList[i]; } FEBuilderGBA.Address.AddAddress(recycle , tsa , isPointerOnly ? 0 : LZ77.getCompressedSize(Program.ROM.Data, tsa) , U.NOT_FOUND , basename + "TSA" , FEBuilderGBA.Address.DataTypeEnum.LZ77TSA); } if (this.ImageList.Count > 0) { uint image; if (i >= this.ImageList.Count) { image = this.ImageList[this.ImageList.Count - 1]; } else { image = this.ImageList[i]; } FEBuilderGBA.Address.AddAddress(recycle , image , isPointerOnly ? 0 : LZ77.getCompressedSize(Program.ROM.Data, image) , U.NOT_FOUND , basename + "IMAGE" , FEBuilderGBA.Address.DataTypeEnum.LZ77IMG); } if (this.PaletteList.Count > 0) { uint palette; if (i >= this.PaletteList.Count) { palette = this.PaletteList[this.PaletteList.Count - 1]; } else { palette = this.PaletteList[i]; } FEBuilderGBA.Address.AddAddress(recycle , palette , 2 * 16 , U.NOT_FOUND , basename + "PAL" , FEBuilderGBA.Address.DataTypeEnum.PAL); } } FEBuilderGBA.Address.AddPointer(recycle , FramePointer , addr - startAddr , basename + "FRAME" , FEBuilderGBA.Address.DataTypeEnum.ROMANIMEFRAME); } }
//全データの取得 public static void MakeAllDataLength(List <Address> list, bool isPointerOnly) { { uint image = Program.ROM.u32(Program.ROM.RomInfo.worldmap_big_image_pointer()); uint palette = Program.ROM.u32(Program.ROM.RomInfo.worldmap_big_palette_pointer()); uint dpalette = Program.ROM.u32(Program.ROM.RomInfo.worldmap_big_dpalette_pointer()); uint palettemap = Program.ROM.u32(Program.ROM.RomInfo.worldmap_big_palettemap_pointer()); FEBuilderGBA.Address.AddAddress(list, image , isPointerOnly ? 0 : (uint)(480 / 2 * 320) , Program.ROM.RomInfo.worldmap_big_image_pointer() , "worldmap_big_image" , FEBuilderGBA.Address.DataTypeEnum.BIN); FEBuilderGBA.Address.AddAddress(list, palette , 0x20 * 4 , Program.ROM.RomInfo.worldmap_big_palette_pointer() , "worldmap_big_palette" , FEBuilderGBA.Address.DataTypeEnum.PAL); FEBuilderGBA.Address.AddAddress(list, dpalette , 0x20 * 4 , Program.ROM.RomInfo.worldmap_big_dpalette_pointer() , "worldmap_big_dpalette" , FEBuilderGBA.Address.DataTypeEnum.PAL); FEBuilderGBA.Address.AddAddress(list, palettemap , isPointerOnly ? 0 : LZ77.getCompressedSize(Program.ROM.Data, palettemap) , Program.ROM.RomInfo.worldmap_big_palettemap_pointer() , "worldmap_big_palettemap" , FEBuilderGBA.Address.DataTypeEnum.BIN); } { FEBuilderGBA.Address.AddLZ77Pointer(list , Program.ROM.RomInfo.worldmap_event_image_pointer() , "worldmap_event_image" , isPointerOnly , FEBuilderGBA.Address.DataTypeEnum.LZ77IMG); FEBuilderGBA.Address.AddLZ77Pointer(list , Program.ROM.RomInfo.worldmap_event_tsa_pointer() , "worldmap_event_image" , isPointerOnly , FEBuilderGBA.Address.DataTypeEnum.LZ77TSA); FEBuilderGBA.Address.AddPointer(list , Program.ROM.RomInfo.worldmap_event_palette_pointer() , 0x20 * 4 , "worldmap_event_palette" , FEBuilderGBA.Address.DataTypeEnum.PAL); } { FEBuilderGBA.Address.AddLZ77Pointer(list , Program.ROM.RomInfo.worldmap_mini_image_pointer() , "worldmap_mini_image" , isPointerOnly , FEBuilderGBA.Address.DataTypeEnum.LZ77IMG); FEBuilderGBA.Address.AddPointer(list , Program.ROM.RomInfo.worldmap_mini_palette_pointer() , 0x20 * 1 , "worldmap_mini_palette" , FEBuilderGBA.Address.DataTypeEnum.PAL); } { FEBuilderGBA.Address.AddLZ77Pointer(list , Program.ROM.RomInfo.worldmap_icon1_pointer() , "worldmap_icon1" , isPointerOnly , FEBuilderGBA.Address.DataTypeEnum.LZ77IMG); FEBuilderGBA.Address.AddPointer(list , Program.ROM.RomInfo.worldmap_icon_palette_pointer() , 0x20 * 2 , "worldmap_icon_palette" , FEBuilderGBA.Address.DataTypeEnum.PAL); } { FEBuilderGBA.Address.AddLZ77Pointer(list , Program.ROM.RomInfo.worldmap_icon2_pointer() , "worldmap_icon2" , isPointerOnly , FEBuilderGBA.Address.DataTypeEnum.LZ77IMG); } { FEBuilderGBA.Address.AddLZ77Pointer(list , Program.ROM.RomInfo.worldmap_road_tile_pointer() , "worldmap_road_tile_image" , isPointerOnly , FEBuilderGBA.Address.DataTypeEnum.LZ77IMG); } { InputFormRef ifr = Border_Init(null); FEBuilderGBA.Address.AddAddress(list, ifr, "WorldmapCountyBorder", new uint[] { 0, 4 }); uint addr = ifr.BaseAddress; for (int i = 0; i < ifr.DataCount; i++, addr += ifr.BlockSize) { string name = "WorldmapCountyBorder " + U.To0xHexString(i); FEBuilderGBA.Address.AddLZ77Pointer(list, 0 + addr , name + " IMAGE" , isPointerOnly , FEBuilderGBA.Address.DataTypeEnum.POINTER); FEBuilderGBA.Address.AddROMTCSPointer(list, 0 + addr , name + " ROMTCS" , isPointerOnly ); } } { string name = "WorldMapIconData"; InputFormRef InputFormRef = ICON_Init(null); FEBuilderGBA.Address.AddAddress(list, InputFormRef, name, new uint[] { 4 }); } }
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; } } }