using LibXom.Blocks; using LibXom.Data; using LibXom.Streams; using System.Text; namespace LibXom { public class XomWriter { private XomStreamWriter xomStream; private XomFile xomFile; private void writeMoik(MoikBlock moikBlock) { xomStream.WriteStr(moikBlock.Name); xomStream.WriteInt32BE(moikBlock.Version); xomStream.Skip(0x10); xomStream.WriteInt32(moikBlock.NumTypes); xomStream.WriteInt32(moikBlock.NumCtnr); xomStream.WriteInt32(moikBlock.NumCtnr); xomStream.Skip(0x1C); } private void writeType(TypeBlock typeBlock) { xomStream.WriteStr(typeBlock.Name); xomStream.Skip(0x4); xomStream.WriteInt32(typeBlock.NumCtnr); xomStream.Skip(0x4); xomStream.WriteBytes(typeBlock.XBytes); xomStream.WriteStrLen(typeBlock.TypeName, 0x20); } private void writeGuid(GuidBlock guidBlock) { xomStream.WriteStr(guidBlock.Name); xomStream.WriteInt32(guidBlock.Unk0); xomStream.WriteInt32(guidBlock.Unk1); xomStream.WriteInt32(guidBlock.Unk2); } private void writeSchm(SchmBlock schmBlock) { xomStream.WriteStr(schmBlock.Name); xomStream.WriteInt32(schmBlock.Unk0); xomStream.WriteInt32(schmBlock.Unk1); xomStream.WriteInt32(schmBlock.Unk2); } private void writeStrs(StrsBlock strsBlock) { xomStream.WriteStr(strsBlock.Name); xomStream.WriteInt32(strsBlock.NumStrs); xomStream.WriteInt32(strsBlock.StringsSectionSz); foreach (int offset in strsBlock.OffsetList) xomStream.WriteInt32(offset); foreach (string str in strsBlock.StringList) xomStream.WriteCStr(str); } private void writeCtnr(CtnrBlock ctnrBlock) { xomStream.WriteStr(ctnrBlock.Name); xomStream.WriteBytes(ctnrBlock.Data); } private void writeBlocks(XomBlock[] blocks) { foreach(XomBlock block in blocks) { if (block is MoikBlock) writeMoik(block as MoikBlock); if (block is GuidBlock) writeGuid(block as GuidBlock); if (block is SchmBlock) writeSchm(block as SchmBlock); if (block is StrsBlock) writeStrs(block as StrsBlock); if (block is TypeBlock) writeType(block as TypeBlock); if (block is CtnrBlock) writeCtnr(block as CtnrBlock); } } public static void WriteXom(XomFile xfile, Stream output) { XomWriter writer = new XomWriter(output, xfile); writer.writeBlocks(xfile.generateBlocks()); output.WriteByte(0); output.WriteByte(0); } public static byte[] WriteXom(XomFile xfile) { using (MemoryStream ms = new MemoryStream()) { WriteXom(xfile, ms); ms.Seek(0, SeekOrigin.Begin); return ms.ToArray(); } } public static void WriteXom(XomFile xfile, string filename) { using(FileStream fs = File.OpenWrite(filename)) { byte[] xData = WriteXom(xfile); fs.Write(xData, 0, xData.Length); } } internal XomWriter(Stream xomStream, XomFile xomFile) { this.xomStream = new XomStreamWriter(xomStream); this.xomFile = xomFile; } } }