public static uint CheckDuplicateMapChangeID(uint mapid, int current_no) { List <ChangeSt> changeList = new List <ChangeSt>(); uint change_addr = MapSettingForm.GetMapChangeAddrWhereMapID(mapid); if (change_addr == U.NOT_FOUND) { return(U.NOT_FOUND); } InputFormRef N_InputFormRef = N_Init(null); N_InputFormRef.ReInit(change_addr); if (current_no >= N_InputFormRef.DataCount) { return(U.NOT_FOUND); } change_addr = change_addr + (uint)(current_no * N_InputFormRef.BlockSize); if (!U.isSafetyOffset(change_addr)) { return(U.NOT_FOUND); } uint no = Program.ROM.u8(change_addr + 0); if (CheckDuplicateMapChangeIDLow(mapid, N_InputFormRef, no, change_addr)) { return(MakeNewUniqeMapChangeID(mapid, N_InputFormRef, change_addr)); } return(U.NOT_FOUND); }
public static List <ChangeSt> MakeChangeList(uint mapid) { List <ChangeSt> changeList = new List <ChangeSt>(); uint change_addr = MapSettingForm.GetMapChangeAddrWhereMapID(mapid); if (change_addr == U.NOT_FOUND) { return(changeList); } InputFormRef N_InputFormRef = N_Init(null); N_InputFormRef.ReInit(change_addr); for (int i = 0; i < N_InputFormRef.DataCount; i++) { ChangeSt p = new ChangeSt(); p.no = Program.ROM.u8(change_addr + 0); p.x = Program.ROM.u8(change_addr + 1); p.y = Program.ROM.u8(change_addr + 2); p.width = Program.ROM.u8(change_addr + 3); p.height = Program.ROM.u8(change_addr + 4); p.addr = Program.ROM.p32(change_addr + 8); p.self_change_addr = change_addr; changeList.Add(p); change_addr += N_InputFormRef.BlockSize; } return(changeList); }
//マップ変化のベース領域がなければ割り当てる public static bool PreciseChangeList(uint mapid) { List <ChangeSt> changeList = new List <ChangeSt>(); uint change_addr = MapSettingForm.GetMapChangeAddrWhereMapID(mapid); if (U.isSafetyOffset(change_addr)) { return(true); } return(PreciseChangeListForce(mapid) != 0); }
public static void MakeFlagIDArray(uint mapid, List <UseFlagID> list) { uint pointer; uint change_addr = MapSettingForm.GetMapChangeAddrWhereMapID(mapid, out pointer); if (change_addr == U.NOT_FOUND) { return; } InputFormRef N_InputFormRef = N_Init(null); N_InputFormRef.ReInitPointer(pointer); UseFlagID.AppendFlagIDFixedMapID(list, FELint.Type.MAPCHANGE, N_InputFormRef, 5, mapid); }
private void AddressList_SelectedIndexChanged(object sender, EventArgs e) { U.AddrResult ar = InputFormRef.SelectToAddrResult(this.AddressList); uint mapid = ar.tag; MapPictureBox.LoadMap(mapid); this.MapPictureBox.ClearAllPoint(); uint change_addr = MapSettingForm.GetMapChangeAddrWhereMapID(mapid); if (!U.isSafetyOffset(change_addr)) { this.N_InputFormRef.ClearSelect(true); this.N_AddressListExpandsButton_80.Enabled = false; return; } this.N_InputFormRef.ReInit(change_addr); }
private void MAP_LISTBOX_SelectedIndexChanged(object sender, EventArgs e) { uint mapid = (uint)AddressList.SelectedIndex; if (mapid == U.NOT_FOUND) { return; } uint addr = MapSettingForm.GetMapChangeAddrWhereMapID(mapid); if (!U.isSafetyOffset(addr)) { return; } U.ForceUpdate(this.ReadStartAddress, addr); this.InputFormRef.ReInit(addr); }
//全データの取得 public static void MakeAllDataLength(List <Address> list) { InputFormRef N_InputFormRef = N_Init(null); uint mapmax = MapSettingForm.GetDataCount(); for (uint mapid = 0; mapid < mapmax; mapid++) { uint pointer; uint change_addr = MapSettingForm.GetMapChangeAddrWhereMapID(mapid, out pointer); if (change_addr == U.NOT_FOUND) { continue; } //N_InputFormRef.ReInit(change_addr); N_InputFormRef.ReInitPointer(pointer); string name = "MapChange map:" + U.To0xHexString(mapid); FEBuilderGBA.Address.AddAddress(list, N_InputFormRef, name, new uint[] { 8 }); List <U.AddrResult> arlist = N_InputFormRef.MakeList(); for (int n = 0; n < arlist.Count; n++) { uint addr = arlist[n].addr; uint w = Program.ROM.u8((uint)addr + 3); //サイズw uint h = Program.ROM.u8((uint)addr + 4); //サイズh uint change_mar = Program.ROM.p32((uint)addr + 8); //変化ポインタ if (!U.isSafetyOffset(change_mar)) { continue; } name = "MapChange map:" + U.To0xHexString(mapid) + " n:" + U.To0xHexString(n); FEBuilderGBA.Address.AddAddress(list, change_mar , w * h * 2 , addr + 8 , name , Address.DataTypeEnum.BIN); } } }
static string GetNameLow(uint mapid, uint changeid) { uint pointer; uint change_addr = MapSettingForm.GetMapChangeAddrWhereMapID(mapid, out pointer); if (change_addr == U.NOT_FOUND) { return(""); } InputFormRef N_InputFormRef = N_Init(null); N_InputFormRef.ReInitPointer(pointer); for (int i = 0; i < N_InputFormRef.DataCount; i++) { uint no = Program.ROM.u8(change_addr + 0); if (no == changeid) { return(Program.CommentCache.At(change_addr)); } change_addr += N_InputFormRef.BlockSize; } return(""); }
private void MAP_LISTBOX_SelectedIndexChanged(object sender, EventArgs e) { uint mapid = (uint)MAP_LISTBOX.SelectedIndex; if (mapid == U.NOT_FOUND) { this.InputFormRef.ClearSelect(); return; } uint addr = MapSettingForm.GetMapChangeAddrWhereMapID(mapid); if (!Program.ROM.isSafetyOffset(addr)) { this.InputFormRef.ClearSelect(); return; } this.ReadStartAddress.Value = addr; MapPictureBox.LoadMap(mapid); this.MapPictureBox.ClearAllPoint(); this.InputFormRef.ReInit(addr); }
//プログラムからのデータ拡張 public static bool ResizeChangeList(uint mapid, uint newcount) { List <ChangeSt> changeList = new List <ChangeSt>(); uint change_addr = MapSettingForm.GetMapChangeAddrWhereMapID(mapid); if (change_addr == U.NOT_FOUND) { return(false); } InputFormRef N_InputFormRef = N_Init(null); N_InputFormRef.ReInit(change_addr); uint olddatasize = N_InputFormRef.DataCount * N_InputFormRef.BlockSize; uint newdatasize = (newcount + 1) * N_InputFormRef.BlockSize; if (newdatasize < olddatasize) {//新しく確保するテーブル数が小さい場合 //特に何もしない. return(true); } //既存データの取得 byte[] oldDataByte = Program.ROM.getBinaryData(change_addr, olddatasize); //新規 byte[] newDataByte = new byte[newdatasize]; Array.Copy(oldDataByte, newDataByte, olddatasize); //新規に確保した領域にindex番号等を振る. int i = (int)N_InputFormRef.DataCount; for (; i < newcount; i++) { uint offset = (uint)(i * N_InputFormRef.BlockSize); U.write_u8(newDataByte, (uint)offset + 0, (uint)i); U.write_u8(newDataByte, (uint)offset + 3, 1); //サイズw U.write_u8(newDataByte, (uint)offset + 4, 1); //サイズh } //終端データ(newdata+1で確保しているため安全) U.write_u8(newDataByte, (uint)(i * N_InputFormRef.BlockSize), (uint)0xff); Undo.UndoData undodata = Program.Undo.NewUndoData("Resize MapChange", mapid.ToString("X"), newcount.ToString("X")); //新規領域の確保 uint newaddr = InputFormRef.AppendBinaryData(newDataByte, undodata); if (newaddr == U.NOT_FOUND) { Program.Undo.Rollback(undodata); return(false); } //PLISTのポインタを書き換える. MapSettingForm.PLists plist = MapSettingForm.GetMapPListsWhereMapID(mapid); bool r = MapPointerForm.Write_Plsit(MapPointerForm.PLIST_TYPE.CHANGE, plist.mapchange_plist, newaddr, undodata); if (!r) { Program.Undo.Rollback(undodata); return(false); } Program.Undo.Push(undodata); return(true); }