Worms4Editor/LibXom/XomWriter.cs

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;
}
}
}