115 lines
3.6 KiB
C#
115 lines
3.6 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|