public void saveByReconstructing(string path)
{
try
{
this.IsCompressed = false;
MemoryStream m = new MemoryStream();
m.WriteBytes(header);
// Set numblocks to zero
m.WriteValueS32(0);
//Write the magic number (What is this?)
m.WriteBytes(new byte[] { 0xF2, 0x56, 0x1B, 0x4E });
// Write 4 bytes of 0
m.WriteValueS32(0);
//name table
NameOffset = (int)m.Position;
NameCount = names.Count;
foreach (string name in names)
{
m.WriteValueS32(name.Length + 1);
m.WriteString(name);
m.WriteByte(0);
m.WriteValueS32(0);
m.WriteValueS32(458768);
}
//import table
ImportOffset = (int)m.Position;
ImportCount = imports.Count;
foreach (ImportEntry e in imports)
{
m.WriteBytes(e.header);
}
//export table
ExportOffset = (int)m.Position;
ExportCount = exports.Count;
for (int i = 0; i < exports.Count; i++)
{
ME1ExportEntry e = exports[i];
e.headerOffset = (uint)m.Position;
m.WriteBytes(e.header);
}
//freezone
int FreeZoneSize = expDataBegOffset - FreeZoneStart;
FreeZoneStart = (int)m.Position;
m.Write(new byte[FreeZoneSize], 0, FreeZoneSize);
expDataBegOffset = (int)m.Position;
//export data
for (int i = 0; i < exports.Count; i++)
{
ME1ExportEntry e = exports[i];
e.DataOffset = (int)m.Position;
e.DataSize = e.Data.Length;
m.WriteBytes(e.Data);
long pos = m.Position;
m.Seek(e.headerOffset + 32, SeekOrigin.Begin);
m.WriteValueS32(e.DataSize);
m.WriteValueS32(e.DataOffset);
m.Seek(pos, SeekOrigin.Begin);
}
//update header
m.Seek(0, SeekOrigin.Begin);
m.WriteBytes(header);
File.WriteAllBytes(path, m.ToArray());
AfterSave();
}
catch (Exception ex)
{
MessageBox.Show("PCC Save error:\n" + ex.Message);
}
}