public void extractCfgBin(BinaryReaderX br, string prefix = "") { long bk; //Header Header cfgHeader = br.ReadStruct <Header>(); headerList.Add(cfgHeader); List <EditorStruct> editorEntriesLocal = new List <EditorStruct>(); editorEntriesLocal.Add(br.ReadStruct <EditorStruct>()); //getting Editor's notes entries while (true) { Label label = new Label(); EditorStruct entryE = br.ReadStruct <EditorStruct>(); editorEntriesLocal.Add(entryE); label.Name = prefix + "editor" + (editorEntriesLocal.Count - 1).ToString(); label.TextID = entryE.ID; label.TextOffset = cfgHeader.dataOffset + entryE.entryOffset; bk = br.BaseStream.Position; br.BaseStream.Position = label.TextOffset; string text = ""; byte part = br.ReadByte(); while (part != 0) { text += Encoding.GetEncoding("ascii").GetString(new byte[] { part }); part = br.ReadByte(); } br.BaseStream.Position = label.TextOffset; label.Text = text; br.BaseStream.Position = bk; Labels.Add(label); if (entryE.endingFlag == 0x0101) { break; } } editorEntries.Add(editorEntriesLocal); bool found = false; bk = br.BaseStream.Position; while (br.BaseStream.Position < cfgHeader.dataOffset && found == false) { if (br.ReadInt32() == (int)(editorEntries[editorEntries.Count - 1][editorEntries[editorEntries.Count - 1].Count - 1].entryOffset + Labels[Labels.Count - 1].Text.Length + 1)) { found = true; } } br.BaseStream.Position = bk; if (found == false) { editorRest.Add(br.ReadBytes((int)(cfgHeader.dataOffset - br.BaseStream.Position))); textRest.Add(null); textEntries.Add(null); } else { editorRest.Add(null); List <TextStruct> textEntriesLocal = new List <TextStruct>(); textEntriesLocal.Add(br.ReadStruct <TextStruct>()); //getting text entries TextStruct entryT; TextStruct entryT2; int entryCount = 1; do { Label label = new Label(); entryT = br.ReadStruct <TextStruct>(); textEntriesLocal.Add(entryT); entryT2 = br.ReadStruct <TextStruct>(); br.BaseStream.Position -= 0x14; if (entryT.entryOffset != 0xFFFFFFFF) { label.Name = prefix + "text" + entryCount.ToString(); entryCount++; label.TextID = entryT.ID; label.TextOffset = cfgHeader.dataOffset + entryT.entryOffset; bk = br.BaseStream.Position; br.BaseStream.Position = label.TextOffset; int count = 0; byte part = br.ReadByte(); while (part != 0) { count++; part = br.ReadByte(); } count++; br.BaseStream.Position = label.TextOffset; label.Text = getUnicodeString(new BinaryReaderX(new MemoryStream(br.ReadBytes(count)))); br.BaseStream.Position = bk; Labels.Add(label); } } while (entryT.unk3 != 0xffffff00 && (entryT2.entryOffset <= br.BaseStream.Length || entryT2.entryOffset == 0xFFFFFFFF)); textEntries.Add(textEntriesLocal); if (br.BaseStream.Position < cfgHeader.dataOffset) { textRest.Add(br.ReadBytes((int)cfgHeader.dataOffset - (int)br.BaseStream.Position)); } } }
public BinaryReaderX createCfg(int part) { long bk; BinaryWriterX br = new BinaryWriterX(new MemoryStream()); br.WriteStruct <Header>(headerList[part]); for (int j = 0; j < editorEntries[part].Count; j++) { if (j > 0) { EditorStruct bk2 = editorEntries[part][j]; var success1 = (headerList[part].dataOffset > br.BaseStream.Length) ? bk2.entryOffset = 0 : bk2.entryOffset = (uint)br.BaseStream.Length - headerList[part].dataOffset; bk = br.BaseStream.Position; var success2 = (headerList[part].dataOffset > br.BaseStream.Length) ? br.BaseStream.Position = headerList[part].dataOffset : br.BaseStream.Position = br.BaseStream.Length; br.Write(Encoding.GetEncoding("shift-jis").GetBytes(Labels[labelCount++].Text)); br.Write((byte)0x00); br.BaseStream.Position = bk; editorEntries[part][j] = bk2; } br.WriteStruct <EditorStruct>(editorEntries[part][j]); } if (editorRest[part] != null) { br.Write(editorRest[part]); } else { for (int j = 0; j < textEntries[part].Count; j++) { if (j > 0 && textEntries[part][j].entryOffset != 0xFFFFFFFF) { TextStruct bk2 = textEntries[part][j]; var success1 = (headerList[part].dataOffset > br.BaseStream.Length) ? bk2.entryOffset = 0 : bk2.entryOffset = (uint)br.BaseStream.Length - headerList[part].dataOffset; bk = br.BaseStream.Position; var success2 = (headerList[part].dataOffset > br.BaseStream.Length) ? br.BaseStream.Position = headerList[part].dataOffset : br.BaseStream.Position = br.BaseStream.Length; br.Write(Encoding.GetEncoding("shift-jis").GetBytes(Labels[labelCount++].Text)); br.Write((byte)0x00); br.BaseStream.Position = bk; textEntries[part][j] = bk2; } br.WriteStruct <TextStruct>(textEntries[part][j]); } if (textRest[part] != null) { br.Write(textRest[part]); } } br.BaseStream.Position = 0x8; br.Write((int)(br.BaseStream.Length - headerList[part].dataOffset)); br.BaseStream.Position = br.BaseStream.Length; while (br.BaseStream.Position % 16 != 0) { br.Write((byte)0xFF); } return(new BinaryReaderX(br.BaseStream)); }
public void Save(string filename) { long bk; using (var bw = new BinaryWriterX(File.Create(filename))) { bw.WriteStruct(cfgHeader); for (int j = 0; j < editorEntries.Count; j++) { if (j > 0) { EditorStruct bk2 = editorEntries[j]; var success1 = (cfgHeader.dataOffset > bw.BaseStream.Length) ? bk2.entryOffset = 0 : bk2.entryOffset = (uint)bw.BaseStream.Length - cfgHeader.dataOffset; bk = bw.BaseStream.Position; var success2 = (cfgHeader.dataOffset > bw.BaseStream.Length) ? bw.BaseStream.Position = cfgHeader.dataOffset : bw.BaseStream.Position = bw.BaseStream.Length; bw.Write(Encoding.GetEncoding("shift-jis").GetBytes(Labels[labelCount++].Text)); bw.Write((byte)0x00); bw.BaseStream.Position = bk; editorEntries[j] = bk2; } bw.WriteStruct <EditorStruct>(editorEntries[j]); } if (editorRest != null) { bw.Write(editorRest); } else { for (int j = 0; j < textEntries.Count; j++) { if (j > 0 && textEntries[j].entryOffset != 0xFFFFFFFF) { TextStruct bk2 = textEntries[j]; var success1 = (cfgHeader.dataOffset > bw.BaseStream.Length) ? bk2.entryOffset = 0 : bk2.entryOffset = (uint)bw.BaseStream.Length - cfgHeader.dataOffset; bk = bw.BaseStream.Position; var success2 = (cfgHeader.dataOffset > bw.BaseStream.Length) ? bw.BaseStream.Position = cfgHeader.dataOffset : bw.BaseStream.Position = bw.BaseStream.Length; bw.Write(Encoding.GetEncoding("shift-jis").GetBytes(Labels[labelCount++].Text)); bw.Write((byte)0x00); bw.BaseStream.Position = bk; textEntries[j] = bk2; } bw.WriteStruct(textEntries[j]); } if (textRest != null) { bw.Write(textRest); } } bw.BaseStream.Position = 0x8; bw.Write((int)(bw.BaseStream.Length - cfgHeader.dataOffset)); bw.BaseStream.Position = bw.BaseStream.Length; bw.WriteAlignment(0x10, 0xff); } }