/// <summary> /// Creates a file given data, whether it's compressed and the RW version. /// </summary> /// <param name="name">Name of this ONE file.</param> /// <param name="isDataCompressed">Whether the data is compressed.</param> /// <param name="data">Uncompressed data belonging to the file</param> /// <param name="rwVersion">RenderWare version corresponding to this file.</param> public ManagedOneFile(string name, byte[] data, bool isDataCompressed, RwVersion rwVersion) { Name = name; IsDataCompressed = isDataCompressed; Data = data; RwVersion = rwVersion; }
/// <summary> /// Creates a file given data, whether it's compressed and the RW version. /// </summary> /// <param name="name">Name of this ONE file.</param> /// <param name="isDataCompressed">Whether the data is compressed.</param> /// <param name="data">Uncompressed data belonging to the file</param> public ManagedOneFile(string name, byte[] data, bool isDataCompressed) { Name = name; IsDataCompressed = isDataCompressed; Data = data; RwVersion = new RwVersion(3, 2, 0, 0); }
/// <summary> /// Creates a ONE archive from a set of files. /// </summary> /// <param name="files">The files to create an archive from.</param> /// <param name="version">The version of the archive. Heroes' default is 3.5.0.0. Consider using 3.3.0.0 to support all available prototypes.</param> /// <param name="bufferSize">Size of the search buffer used in compression between 0-8191.</param> public static byte[] FromFiles(IList <ManagedOneFile> files, RwVersion version, int bufferSize = 255) { // Compress all files. files = files.Select(x => new ManagedOneFile(x.Name, x.GetCompressedData(bufferSize), true)).ToArray(); // Calculate sizes. var numberOfFiles = files.Count + 2; // Two dummy entries. var sizeOfHeaders = sizeof(OneArchiveHeader) + sizeof(OneNameSectionHeader); var sizeOfNameSection = sizeof(OneFileName) * numberOfFiles; var sizeOfFileSection = files.Sum(x => x.GetCompressedData().Length + sizeof(OneFileEntry)); var totalSize = sizeOfHeaders + sizeOfNameSection + sizeOfFileSection; // Make file. using var memStream = new ExtendedMemoryStream(totalSize); memStream.Append(new OneArchiveHeader(totalSize - sizeof(OneArchiveHeader), version)); memStream.Append(new OneNameSectionHeader(sizeOfNameSection, version)); memStream.Append(new OneFileName("")); // Dummy entries memStream.Append(new OneFileName("")); foreach (var file in files) { memStream.Append(new OneFileName(file.Name)); } int nameSectionIndex = 2; foreach (var file in files) { memStream.Append(new OneFileEntry(nameSectionIndex++, file.GetCompressedData().Length, file.RwVersion)); memStream.Append(file.GetCompressedData()); } return(memStream.ToArray()); }
/// <summary> /// Creates a ONE file entry given an index, size and version/ /// </summary> /// <param name="fileNameIndex">Index in the name section.</param> /// <param name="fileSize">Size of the file.</param> /// <param name="rwVersion">Version of the file.</param> public OneFileEntry(int fileNameIndex, int fileSize, RwVersion rwVersion) { FileNameIndex = fileNameIndex; FileSize = fileSize; RwVersion = rwVersion; }
/// <summary> /// Creates a new Archive header. /// </summary> /// <param name="renderWareVersion">RenderWare version tag assigned to this archive</param> public OneArchiveHeader(RwVersion renderWareVersion) : this() { RenderWareVersion = renderWareVersion; }
/// <summary> /// Creates a new Archive header. /// </summary> /// <param name="fileSize">Size of entire file, minus header</param> /// <param name="renderWareVersion">RenderWare version tag assigned to this archive</param> public OneArchiveHeader(int fileSize, RwVersion renderWareVersion) : this() { FileSize = fileSize; RenderWareVersion = renderWareVersion; }
/// <param name="unknown">Unknown. Probably compression flag.</param> /// <param name="fileNameSectionLength">Length of this section.</param> /// <param name="renderWareVersion">RenderWare version assigned to this section.</param> public OneNameSectionHeader(int fileNameSectionLength, RwVersion renderWareVersion, int unknown = 1) { Unknown = unknown; FileNameSectionLength = fileNameSectionLength; RenderWareVersion = renderWareVersion; }