Fix saving
This commit is contained in:
parent
53ffd4eeea
commit
0247b45335
|
@ -64,6 +64,52 @@ namespace LibXom.Data
|
||||||
|
|
||||||
throw new XomFileComponentNotFoundException("A XOM Components ID could not be found in the Component List.");
|
throw new XomFileComponentNotFoundException("A XOM Components ID could not be found in the Component List.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal XomBlock[] generateBlocks()
|
||||||
|
{
|
||||||
|
XomContainer[] containers = this.XomContainers;
|
||||||
|
XomType[] types = this.XomTypes;
|
||||||
|
XomString[] strings = XomStrings;
|
||||||
|
|
||||||
|
List<XomBlock> blocks = new List<XomBlock>();
|
||||||
|
// add MOIK block
|
||||||
|
blocks.Add(new MoikBlock(this.version, containers.Length, types.Length));
|
||||||
|
// add type blocks
|
||||||
|
foreach (XomType type in types) blocks.Add(new TypeBlock(type.Containers.Length, type.Md5, type.Name));
|
||||||
|
|
||||||
|
// Add guid and schm block
|
||||||
|
blocks.Add(new GuidBlock(0, 0, 0));
|
||||||
|
blocks.Add(new SchmBlock(unk0, 0, 0));
|
||||||
|
|
||||||
|
|
||||||
|
// Create a list of all strings and the offset they would appear in the strs block.
|
||||||
|
Dictionary<string, int> stringOffsets = new Dictionary<string, int>();
|
||||||
|
int loc = 0;
|
||||||
|
XomString[] stringsSorted = strings.OrderBy(o => o.Value, StringComparer.Ordinal).ToArray();
|
||||||
|
string[] stringLst = new string[stringsSorted.Length];
|
||||||
|
for (int i = 0; i < stringsSorted.Length; i++)
|
||||||
|
{
|
||||||
|
XomString str = stringsSorted[i];
|
||||||
|
stringLst[i] = str.Value;
|
||||||
|
stringOffsets.Add(str.Value, loc);
|
||||||
|
loc += str.Value.Length + 1; // str length, + \0 for terminator.
|
||||||
|
}
|
||||||
|
|
||||||
|
// now create the strs block
|
||||||
|
int[] offsetLst = new int[strings.Length];
|
||||||
|
for(int i = 0; i < strings.Length; i++)
|
||||||
|
{
|
||||||
|
XomString str = strings[i];
|
||||||
|
offsetLst[i] = stringOffsets[str.Value];
|
||||||
|
}
|
||||||
|
blocks.Add(new StrsBlock(strings.Length, loc, offsetLst, stringLst));
|
||||||
|
|
||||||
|
// Add containers
|
||||||
|
foreach (XomContainer container in containers) blocks.Add(new CtnrBlock(container.GetData()));
|
||||||
|
|
||||||
|
return blocks.ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
internal XomFile(XomBlock[] xomBlocks)
|
internal XomFile(XomBlock[] xomBlocks)
|
||||||
{
|
{
|
||||||
MoikBlock? moikBlock = XomBlockHandler.GetBlockByName(xomBlocks, "MOIK") as MoikBlock;
|
MoikBlock? moikBlock = XomBlockHandler.GetBlockByName(xomBlocks, "MOIK") as MoikBlock;
|
||||||
|
@ -101,11 +147,7 @@ namespace LibXom.Data
|
||||||
{
|
{
|
||||||
int offset = stringBlock.OffsetList[i];
|
int offset = stringBlock.OffsetList[i];
|
||||||
string value = stringOffsets[offset];
|
string value = stringOffsets[offset];
|
||||||
// Were storing the offset here so that i can figure out how to best order the values again
|
xomStrings.Add(new XomString(this, value));
|
||||||
// when reconstructing the value (eg make it as close to the actual game)
|
|
||||||
// ideally this wouldnt be needed.
|
|
||||||
// TODO: Figure out how strings are ordered, so i can ditch the offset variable.
|
|
||||||
xomStrings.Add(new XomString(this, offset, value));
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,6 @@ namespace LibXom.Data
|
||||||
{
|
{
|
||||||
public class XomString : XomFileComponent
|
public class XomString : XomFileComponent
|
||||||
{
|
{
|
||||||
private int offset;
|
|
||||||
private string value;
|
private string value;
|
||||||
|
|
||||||
public override int Id
|
public override int Id
|
||||||
|
@ -19,13 +18,6 @@ namespace LibXom.Data
|
||||||
return this.fileBelongs.calculateIdForXomFileComponent(this.uuid, fileBelongs.XomStrings);
|
return this.fileBelongs.calculateIdForXomFileComponent(this.uuid, fileBelongs.XomStrings);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public int Offset
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return offset;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public string Value
|
public string Value
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
|
@ -33,10 +25,9 @@ namespace LibXom.Data
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
internal XomString(XomFile fromFile, int offset, string value)
|
internal XomString(XomFile fromFile, string value)
|
||||||
{
|
{
|
||||||
this.fileBelongs = fromFile;
|
this.fileBelongs = fromFile;
|
||||||
this.offset = offset;
|
|
||||||
this.value = value;
|
this.value = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -150,8 +150,18 @@ namespace LibXom
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void WriteXom()
|
public static void WriteXom(XomFile xfile, string filename)
|
||||||
{
|
{
|
||||||
|
using(FileStream fs = File.OpenWrite(filename))
|
||||||
|
{
|
||||||
|
using (MemoryStream ms = new MemoryStream())
|
||||||
|
{
|
||||||
|
XomWriter writer = new XomWriter(ms, xfile);
|
||||||
|
writer.writeBlocks(writer.xomFile.generateBlocks());
|
||||||
|
ms.Seek(0, SeekOrigin.Begin);
|
||||||
|
ms.CopyTo(fs);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
internal XomWriter(Stream xomStream, XomFile xomFile)
|
internal XomWriter(Stream xomStream, XomFile xomFile)
|
||||||
{
|
{
|
||||||
|
|
|
@ -10,7 +10,6 @@ namespace Worms4Editor
|
||||||
{
|
{
|
||||||
static void Main(string[] args)
|
static void Main(string[] args)
|
||||||
{
|
{
|
||||||
int id = 0;
|
|
||||||
XomFile xfile = XomReader.ReadXomFile(@"Original.xom");
|
XomFile xfile = XomReader.ReadXomFile(@"Original.xom");
|
||||||
//XomFile ps2file = XomReader.ReadXomFile(@"ps2.xom");
|
//XomFile ps2file = XomReader.ReadXomFile(@"ps2.xom");
|
||||||
|
|
||||||
|
@ -23,6 +22,8 @@ namespace Worms4Editor
|
||||||
XomString str = xfile.XomStrings[i];
|
XomString str = xfile.XomStrings[i];
|
||||||
Console.WriteLine(str.Id.ToString("X") + ": " + str.Value);
|
Console.WriteLine(str.Id.ToString("X") + ": " + str.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
XomWriter.WriteXom(xfile, @"Original2.xom");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue