//分割していない場合 static string GetPListNameNotSplite(uint plist, List <U.AddrResult> mapSetting) { if (plist == 0) {//0番はnull return("NULL"); } for (int mapid = 0; mapid < mapSetting.Count; mapid++) { uint addr = mapSetting[mapid].addr; MapSettingForm.PLists plists = MapSettingForm.GetMapPListsWhereAddr(addr); if (plists.anime1_plist == plist) { return("ANIME1 " + MapSettingForm.GetMapNameWhereAddr(addr)); } if (plists.anime2_plist == plist) { return("ANIME2 " + MapSettingForm.GetMapNameWhereAddr(addr)); } if (plists.config_plist == plist) { return("CONFIG " + MapSettingForm.GetMapNameWhereAddr(addr)); } if (plists.event_plist == plist) { return("EVENT " + MapSettingForm.GetMapNameWhereAddr(addr)); } if (plists.mapchange_plist == plist) { return("MAPCHANGE " + MapSettingForm.GetMapNameWhereAddr(addr)); } if (plists.mappointer_plist == plist) { return("MAP " + MapSettingForm.GetMapNameWhereAddr(addr)); } if (plists.palette_plist == plist) { return("PAL " + MapSettingForm.GetMapNameWhereAddr(addr)); } uint obj_plist_low = (plists.obj_plist & 0xFF); uint obj_plist_high = ((plists.obj_plist >> 8) & 0xFF); if (obj_plist_low == plist) { return("OBJ " + MapSettingForm.GetMapNameWhereAddr(addr)); } if (obj_plist_high == plist) { return("OBJ " + MapSettingForm.GetMapNameWhereAddr(addr)); } if (Program.ROM.RomInfo.version() == 6) { uint wmapevent_plist = MapSettingForm.GetWorldMapEventIDWhereAddr(addr); if (wmapevent_plist == 0) { return("WMEVENT " + MapSettingForm.GetMapNameWhereAddr(addr)); } } } return("UNK"); }
uint PListSplitsExpandsOne(MapPointerForm.PLIST_TYPE type, Undo.UndoData undodata) { Debug.Assert(type != PLIST_TYPE.ANIMATION2); //Animation1と一緒に処理しないといけない Debug.Assert(type != PLIST_TYPE.PALETTE); //OBJECTと一緒に処理しないといけない InputFormRef InputFormRef = Init(null, false); InputFormRef.ReInitPointer(GetBasePointer(type)); byte[] newArray = new byte[4 * (256)]; List <U.AddrResult> mapSetting = MapSettingForm.MakeMapIDList(); int mapmax = mapSetting.Count; for (int mapid = 0; mapid < mapmax; mapid++) { if (type == PLIST_TYPE.WORLDMAP_FE6ONLY) { Debug.Assert(Program.ROM.RomInfo.version == 6); uint wmapevent_plist = MapSettingForm.GetWorldMapEventIDWhereAddr(mapSetting[mapid].addr); PListSplitExpandsOneConvertPointer(wmapevent_plist, InputFormRef, newArray); continue; } MapSettingForm.PLists plists = MapSettingForm.GetMapPListsWhereAddr(mapSetting[mapid].addr); if (type == PLIST_TYPE.CHANGE) { PListSplitExpandsOneConvertPointer(plists.mapchange_plist, InputFormRef, newArray); } else if (type == PLIST_TYPE.EVENT) { PListSplitExpandsOneConvertPointer(plists.event_plist, InputFormRef, newArray); } else if (type == PLIST_TYPE.MAP) { PListSplitExpandsOneConvertPointer(plists.mappointer_plist, InputFormRef, newArray); } else if (type == PLIST_TYPE.CONFIG) { PListSplitExpandsOneConvertPointer(plists.config_plist, InputFormRef, newArray); } else if (type == PLIST_TYPE.ANIMATION) { PListSplitExpandsOneConvertPointer(plists.anime1_plist, InputFormRef, newArray); PListSplitExpandsOneConvertPointer(plists.anime2_plist, InputFormRef, newArray); } else { uint obj1_plist = (plists.obj_plist & 0xFF); uint obj2_plist = (plists.obj_plist >> 8) & 0xFF; //FE8にはないが FE7は、 plistを2つ設定できることがある. PListSplitExpandsOneConvertPointer(obj1_plist, InputFormRef, newArray); PListSplitExpandsOneConvertPointer(obj2_plist, InputFormRef, newArray); PListSplitExpandsOneConvertPointer(plists.palette_plist, InputFormRef, newArray); } } //終端の0xFFFFFFFFを念のため入れておきます. // U.write_u32(newArray, 256 * 4, U.NOT_FOUND); uint newpos = InputFormRef.AppendBinaryData(newArray, undodata); if (newpos == U.NOT_FOUND) { throw new PLISTExpandsException(R._("PLIST拡張に失敗しました。\r\ntype={0}\r\nnewaddr=NOT_FOUND", type.ToString())); } if (type == PLIST_TYPE.CONFIG) { Program.ROM.write_p32(Program.ROM.RomInfo.map_config_pointer, newpos, undodata); } else if (type == PLIST_TYPE.ANIMATION) { Program.ROM.write_p32(Program.ROM.RomInfo.map_tileanime1_pointer, newpos, undodata); Program.ROM.write_p32(Program.ROM.RomInfo.map_tileanime2_pointer, newpos, undodata); } else if (type == PLIST_TYPE.OBJECT) { Program.ROM.write_p32(Program.ROM.RomInfo.map_obj_pointer, newpos, undodata); Program.ROM.write_p32(Program.ROM.RomInfo.map_pal_pointer, newpos, undodata); } else if (type == PLIST_TYPE.MAP) { Program.ROM.write_p32(Program.ROM.RomInfo.map_map_pointer_pointer, newpos, undodata); } else if (type == PLIST_TYPE.CHANGE) { Program.ROM.write_p32(Program.ROM.RomInfo.map_mapchange_pointer, newpos, undodata); } else if (type == PLIST_TYPE.EVENT) { Program.ROM.write_p32(Program.ROM.RomInfo.map_event_pointer, newpos, undodata); } else if (type == PLIST_TYPE.WORLDMAP_FE6ONLY) { Program.ROM.write_p32(Program.ROM.RomInfo.map_worldmapevent_pointer, newpos, undodata); } else { Debug.Assert(false); } return(newpos); }
//全データの取得 public static void MakeAllDataLength(List <Address> list, bool isPointerOnly) { InputFormRef InputFormRef = Init(null, IsPlistSplits()); InputFormRef.ReInitPointer(GetBasePointer(PLIST_TYPE.CONFIG)); FEBuilderGBA.Address.AddAddress(list, InputFormRef, "MAPPOINTERS", new uint[] { 0 }); List <U.AddrResult> configList = InputFormRef.MakeList(); InputFormRef.ReInitPointer(GetBasePointer(PLIST_TYPE.ANIMATION)); //ANIMATION2と共有 FEBuilderGBA.Address.AddAddress(list, InputFormRef, "MAPPOINTERS_ANIMATION", new uint[] { 0 }); InputFormRef.ReInitPointer(GetBasePointer(PLIST_TYPE.OBJECT)); //PALETTEと共有 FEBuilderGBA.Address.AddAddress(list, InputFormRef, "MAPPOINTERS_OBJECT", new uint[] { 0 }); List <U.AddrResult> objList = InputFormRef.MakeList(); InputFormRef.ReInitPointer(GetBasePointer(PLIST_TYPE.MAP)); FEBuilderGBA.Address.AddAddress(list, InputFormRef, "MAPPOINTERS_MAP", new uint[] { 0 }); List <U.AddrResult> mapList = InputFormRef.MakeList(); InputFormRef.ReInitPointer(GetBasePointer(PLIST_TYPE.EVENT)); FEBuilderGBA.Address.AddAddress(list, InputFormRef, "MAPPOINTERS_EVENT", new uint[] { 0 }); InputFormRef.ReInitPointer(GetBasePointer(PLIST_TYPE.CHANGE)); FEBuilderGBA.Address.AddAddress(list, InputFormRef, "MAPPOINTERS_CHANGE", new uint[] { 0 }); if (Program.ROM.RomInfo.version == 6) { InputFormRef.ReInitPointer(GetBasePointer(PLIST_TYPE.CHANGE)); FEBuilderGBA.Address.AddAddress(list, InputFormRef, "MAPPOINTERS_WMAP_EVENT", new uint[] { 0 }); } List <U.AddrResult> mapSetting = MapSettingForm.MakeMapIDList(); for (int mapid = 0; mapid < mapSetting.Count; mapid++) { MapSettingForm.PLists plists = MapSettingForm.GetMapPListsWhereAddr(mapSetting[mapid].addr); //plists.mapchange_plist //別途処理 //plists.event_plist //別途処理 //plists.anime1_plist; //別途処理 //plists.anime2_plist; //別途処理 if (plists.config_plist > 0 && plists.config_plist < configList.Count) { uint pointer = configList[(int)plists.config_plist].addr; string name = "MAP:" + U.To0xHexString(mapid) + " MAP_CHIPSET" + U.ToHexString(plists.config_plist); FEBuilderGBA.Address.AddLZ77Pointer(list , pointer + 0 , name , isPointerOnly , FEBuilderGBA.Address.DataTypeEnum.LZ77MAPCONFIG); } if (plists.mappointer_plist > 0 && plists.mappointer_plist < mapList.Count) { uint pointer = mapList[(int)plists.mappointer_plist].addr; string name = "MAP:" + U.To0xHexString(mapid) + " MAP MAR:" + U.ToHexString(plists.mappointer_plist); FEBuilderGBA.Address.AddLZ77Pointer(list , pointer + 0 , name , isPointerOnly , FEBuilderGBA.Address.DataTypeEnum.LZ77MAPMAR); } if (plists.palette_plist > 0 && plists.palette_plist < objList.Count) { uint pointer = objList[(int)plists.palette_plist].addr; string name = "MAP:" + U.ToHexString(mapid) + " PALETTE:" + U.ToHexString(plists.palette_plist); uint size = 0x20 * MapStyleEditorForm.MAX_MAP_PALETTE_COUNT; FEBuilderGBA.Address.AddPointer(list , pointer + 0 , size , name , FEBuilderGBA.Address.DataTypeEnum.PAL); } if (plists.palette2_plist > 0 && plists.palette2_plist < objList.Count) { uint pointer = objList[(int)plists.palette2_plist].addr; string name = "MAP:" + U.ToHexString(mapid) + " SECOND PALETTE:" + U.ToHexString(plists.palette2_plist); uint size = 0x20 * MapStyleEditorForm.MAX_MAP_PALETTE_COUNT; FEBuilderGBA.Address.AddPointer(list , pointer + 0 , size , name , FEBuilderGBA.Address.DataTypeEnum.PAL); } uint obj_plist_low = (plists.obj_plist & 0xFF); uint obj_plist_high = ((plists.obj_plist >> 8) & 0xFF); if (obj_plist_low > 0 && obj_plist_low < objList.Count) { uint pointer = objList[(int)obj_plist_low].addr; string name = "MAP:" + U.ToHexString(mapid) + " OBJ:" + U.ToHexString(obj_plist_low); FEBuilderGBA.Address.AddLZ77Pointer(list , pointer + 0 , name , isPointerOnly , FEBuilderGBA.Address.DataTypeEnum.LZ77IMG); } if (obj_plist_high > 0 && obj_plist_high < objList.Count) { uint pointer = objList[(int)obj_plist_high].addr; string name = "MAP:" + U.ToHexString(mapid) + " OBJ:" + U.ToHexString(obj_plist_high); FEBuilderGBA.Address.AddLZ77Pointer(list , pointer + 0 , name , isPointerOnly , FEBuilderGBA.Address.DataTypeEnum.LZ77IMG); } } }
static string GetPListNameSplited(uint plist, uint baseaddr, List <U.AddrResult> mapSetting) { //分割している場合 if (plist == 0) {//0番はnull return("NULL"); } MapPointerForm.PLIST_TYPE type = ConvertBaseAddrToType(baseaddr); for (int mapid = 0; mapid < mapSetting.Count; mapid++) { uint addr = mapSetting[mapid].addr; MapSettingForm.PLists plists = MapSettingForm.GetMapPListsWhereAddr(addr); if (plists.anime1_plist == plist && type == PLIST_TYPE.ANIMATION) { return("ANIME1 " + MapSettingForm.GetMapNameWhereAddr(addr)); } if (plists.anime2_plist == plist && type == PLIST_TYPE.ANIMATION) {//ANIME2はANIMEと共有 return("ANIME2 " + MapSettingForm.GetMapNameWhereAddr(addr)); } if (plists.config_plist == plist && type == PLIST_TYPE.CONFIG) { return("CONFIG " + MapSettingForm.GetMapNameWhereAddr(addr)); } if (plists.event_plist == plist && type == PLIST_TYPE.EVENT) { return("EVENT " + MapSettingForm.GetMapNameWhereAddr(addr)); } if (plists.mapchange_plist == plist && type == PLIST_TYPE.CHANGE) { return("MAPCHANGE " + MapSettingForm.GetMapNameWhereAddr(addr)); } if (plists.mappointer_plist == plist && type == PLIST_TYPE.MAP) { return("MAP " + MapSettingForm.GetMapNameWhereAddr(addr)); } if (plists.palette_plist == plist && type == PLIST_TYPE.OBJECT) {//OBJECTとPALは共有 return("PAL " + MapSettingForm.GetMapNameWhereAddr(addr)); } if (plists.palette2_plist == plist && type == PLIST_TYPE.OBJECT) {//OBJECTとPALは共有 return("PAL2 " + MapSettingForm.GetMapNameWhereAddr(addr)); } uint obj_plist_low = (plists.obj_plist & 0xFF); uint obj_plist_high = ((plists.obj_plist >> 8) & 0xFF); if (obj_plist_low == plist && type == PLIST_TYPE.OBJECT) { return("OBJ " + MapSettingForm.GetMapNameWhereAddr(addr)); } if (obj_plist_high == plist && type == PLIST_TYPE.OBJECT) { return("OBJ " + MapSettingForm.GetMapNameWhereAddr(addr)); } if (Program.ROM.RomInfo.version == 6) { uint wmapevent_plist = MapSettingForm.GetWorldMapEventIDWhereAddr(addr); if (wmapevent_plist == 0 && type == PLIST_TYPE.WORLDMAP_FE6ONLY) { return("WMEVENT " + MapSettingForm.GetMapNameWhereAddr(addr)); } } } return("-EMPTY-"); }