public void Write( string outFile, int align = 0x10 )
{
var f = new FileStream( outFile, FileMode.Create );
// create space for header and filelist stuff
for ( int i = 0; i < FilesOffset; ++i ) { f.WriteByte( 0 ); }
// create dummy entry
f.Write( new byte[] { 0x44, 0x55, 0x4D, 0x4D, 0x59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0, 0x10 );
// write files
for ( int i = 0; i < Entries.Count; ++i ) {
if ( Entries[i].Data != null ) {
// special case: if multiple files in a row are identical, only add them once and point the offsets at the same data
// oddly enough for the two times it happens in the original files, it only does it once, so no idea what is actually
// the proper way to handle it, faking it with that last condition
if ( i >= 1 && Entries[i - 1].Data != null && Entries[i - 1].Data.Length == Entries[i].Data.Length && Entries[i].Data.Length > 0x30 ) {
Entries[i - 1].Data.Position = 0;
Entries[i].Data.Position = 0;
if ( Entries[i - 1].Data.IsIdentical( Entries[i].Data, Entries[i].Data.Length ) ) {
Entries[i].Offset = Entries[i - 1].Offset;
continue;
}
}
Entries[i].Offset = (uint)f.Position - FilesOffset;
Entries[i].Data.Position = 0;
Util.CopyStream( Entries[i].Data, f, (int)Entries[i].Data.Length );
while ( f.Length % align != 0 ) { f.WriteByte( 0 ); }
}
}
Filesize = (uint)f.Length;
// write header
f.Position = 0;
f.Write( Encoding.ASCII.GetBytes( Magic ), 0, 8 );
f.WriteUInt32( Filesize.SwapEndian() );
f.WriteUInt32( Unknown.SwapEndian() );
f.WriteUInt32( Filecount.SwapEndian() );
f.WriteUInt32( FilesOffset.SwapEndian() );
f.WriteUInt32( Filesize );
f.WriteUInt32( 0 );
// write file list
for ( int i = 0; i < Entries.Count; ++i ) {
f.Position = 0x20u + i * 0x20u;
f.WriteUInt32( Entries[i].Offset.SwapEndian() );
f.WriteUInt32( Entries[i].FilesizeCompressed.SwapEndian() );
f.WriteUInt32( Entries[i].FilesizeUncompressed.SwapEndian() );
}
f.Close();
}