Ejemplo n.º 1
0
 /// <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;
 }
Ejemplo n.º 2
0
 /// <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);
 }
Ejemplo n.º 3
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());
        }
Ejemplo n.º 4
0
 /// <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;
 }
Ejemplo n.º 5
0
 /// <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;
 }
Ejemplo n.º 6
0
 /// <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;
 }
Ejemplo n.º 7
0
 /// <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;
 }