Exemple #1
0
        /// <summary>
        /// Repacks all files into the pack.
        /// </summary>
        public override void Pack()
        {
            MemoryStream packStream = new MemoryStream();
            BinaryWriter packWriter = new BinaryWriter(packStream);

            byte[] headerData = StreamHelper.ReadFile(this.GameFileName, this.HeaderSize);

            ushort fileCount       = BitConverter.ToUInt16(headerData, 0x06);
            int    fileTableOffset = BitConverter.ToInt32(headerData, 0x08);

            int[]    folderSizes = this.GetFolderSizes();
            string[] folderNames = this.GetFolderNames();

            int folderIndex     = 0;
            int folderFileIndex = 0;
            int pointerOffset   = fileTableOffset;
            int fileOffset      = 0;

            for (int i = 0; i < fileCount; i++)
            {
                while (folderFileIndex >= folderSizes[folderIndex])
                {
                    folderIndex++;
                    folderFileIndex = 0;
                }

                FileType fileType      = this.GetFileType(i);
                string   childFileName = this.DetermineChildFileName(folderNames[folderIndex], fileType, folderFileIndex);
                byte[]   childFileData = StreamHelper.ReadFile(ChildDirectoryPrefix + childFileName);

                StreamHelper.WriteBytes(fileOffset, headerData, pointerOffset);
                StreamHelper.WriteBytes(childFileData.Length, headerData, pointerOffset + 4);

                packWriter.Write(childFileData);

                int padLength = CalculatePaddingLength(childFileData.Length, 4);

                for (int p = 0; p < padLength; p++)
                {
                    packWriter.Write(Padding);
                }

                fileOffset    += childFileData.Length + padLength;
                pointerOffset += 8;
                folderFileIndex++;
            }

            packWriter.Flush();

            MemoryStream contents = new MemoryStream();

            contents.Write(headerData, 0, headerData.Length);
            packStream.WriteTo(contents);

            StreamHelper.WriteFile(this.GameFileName, contents.ToArray());
        }
 public virtual byte[] Serialize()
 {
     using (MemoryStream ms = new MemoryStream())
     {
         using (BinaryWriter bw = new BinaryWriter(ms))
         {
             bw.Write(StreamEntityCode.HikvHeader);
             StreamHelper.WriteBytes(bw, Buffer);
             return(ms.ToArray());
         }
     }
 }
Exemple #3
0
        private static void WriteTriangles(Stream stream, IMesh mesh)
        {
            List <Triangle> triangles = mesh.GetTriangles().ToList();

            byte[] numberOfTriangles = BitConverter.GetBytes(triangles.Count);
            StreamHelper.WriteBytes(stream, numberOfTriangles);

            foreach (Triangle triangle in triangles)
            {
                Vector normal = FindNormal(triangle.V1, triangle.V2, triangle.V3);
                WriteTriangle(stream, triangle, normal);
            }
        }
Exemple #4
0
        private static void WriteTriangle(Stream stream, Triangle triangle, Vector normal)
        {
            StreamHelper.WriteBytes(stream, BitConverter.GetBytes(normal.I));
            StreamHelper.WriteBytes(stream, BitConverter.GetBytes(normal.J));
            StreamHelper.WriteBytes(stream, BitConverter.GetBytes(normal.K));
            StreamHelper.WriteBytes(stream, BitConverter.GetBytes(triangle.V1.X));
            StreamHelper.WriteBytes(stream, BitConverter.GetBytes(triangle.V1.Y));
            StreamHelper.WriteBytes(stream, BitConverter.GetBytes(triangle.V1.Z));
            StreamHelper.WriteBytes(stream, BitConverter.GetBytes(triangle.V2.X));
            StreamHelper.WriteBytes(stream, BitConverter.GetBytes(triangle.V2.Y));
            StreamHelper.WriteBytes(stream, BitConverter.GetBytes(triangle.V2.Z));
            StreamHelper.WriteBytes(stream, BitConverter.GetBytes(triangle.V3.X));
            StreamHelper.WriteBytes(stream, BitConverter.GetBytes(triangle.V3.Y));
            StreamHelper.WriteBytes(stream, BitConverter.GetBytes(triangle.V3.Z));

            byte[] attributeByteCount = new byte[2];
            StreamHelper.WriteBytes(stream, attributeByteCount);
        }
Exemple #5
0
        /// <summary>
        /// Inserts the text strings back into the game file.
        /// </summary>
        /// <returns>A value indicating whether the file was successfully saved.</returns>
        protected override bool SaveText()
        {
            byte[] headerData = StreamHelper.ReadFile(this.GameFileName, this.TextSectionOffset);

            MemoryStream textStream = new MemoryStream();
            BinaryWriter textWriter = new BinaryWriter(textStream);

            // Placeholder for text length
            textWriter.Write((ushort)0x0000);

            byte[] encodedString;
            int    pointerOffset = 0x0C;
            int    textOffset    = 0x02;

            for (int i = 0; i < this.strings.Length; i++)
            {
                encodedString = this.Game.GetBytes(this.strings[i]);
                ushort stringLength = (ushort)encodedString.Length;

                StreamHelper.WriteBytes(textOffset, headerData, pointerOffset);
                textWriter.Write(stringLength);
                textWriter.Write(encodedString);

                pointerOffset += TableEntryLength;
                textOffset    += 0x02 + stringLength;
            }

            textWriter.Flush();

            byte[] textData    = textStream.ToArray();
            ushort textLength  = (ushort)textData.Length;
            ushort totalLength = (ushort)(this.TextSectionOffset + textLength);

            WriteBytes(textLength, textData, 0x00);
            WriteBytes(totalLength, headerData, 0x00);

            MemoryStream contents = new MemoryStream();

            contents.Write(headerData, 0, headerData.Length);
            contents.Write(textData, 0, textData.Length);

            StreamHelper.WriteFile(this.GameFileName, contents.ToArray());
            return(true);
        }
        public static Image GetQRCode(byte[] data, ErrorCorrectionLevel level = ErrorCorrectionLevel.M)
        {
            bool requires16BitLength    = false;
            int  maxBytesInVersion9Code = QRErrorCorrections.GetQRVersionInfo(9).GetCorrectionInfo(level).TotalDataBytes;

            if (maxBytesInVersion9Code - 2 < data.Length)
            {
                // This data requires a version 10 or higher code; will not fit in version 9 or lower.
                // Version 10 and higher codes require 16-bit data lengths.
                requires16BitLength = true;
            }

            StreamHelper sh = new StreamHelper();

            sh.WriteNibble(0x04); // byte mode
            if (requires16BitLength)
            {
                sh.WriteWord((ushort)data.Length);
            }
            else
            {
                sh.WriteByte((byte)data.Length);
            }
            sh.WriteBytes(new ArraySegment <byte>(data));
            sh.WriteNibble(0x00); // terminator
            byte[] binaryData = sh.ToArray();

            int qrCodeVersion;
            ErrorCorrectionLevel errorCorrectionLevel;

            byte[] finalMessageSequence = QRErrorCorrections.GetMessageSequence(binaryData, level, out qrCodeVersion, out errorCorrectionLevel);

            SymbolTemplate template = SymbolTemplate.CreateTemplate(qrCodeVersion);

            template.ErrorCorrectionLevel = errorCorrectionLevel;
            template.PopulateData(finalMessageSequence);
            template.Complete();

            return(template.ToImage());
        }
        public static Image GetQRCode(byte[] data, ErrorCorrectionLevel level = ErrorCorrectionLevel.M)
        {
            bool requires16BitLength = false;
            int maxBytesInVersion9Code = QRErrorCorrections.GetQRVersionInfo(9).GetCorrectionInfo(level).TotalDataBytes;
            if (maxBytesInVersion9Code - 2 < data.Length)
            {
                // This data requires a version 10 or higher code; will not fit in version 9 or lower.
                // Version 10 and higher codes require 16-bit data lengths.
                requires16BitLength = true;
            }

            StreamHelper sh = new StreamHelper();
            sh.WriteNibble(0x04); // byte mode
            if (requires16BitLength)
            {
                sh.WriteWord((ushort)data.Length);
            }
            else
            {
                sh.WriteByte((byte)data.Length);
            }
            sh.WriteBytes(new ArraySegment<byte>(data));
            sh.WriteNibble(0x00); // terminator
            byte[] binaryData = sh.ToArray();

            int qrCodeVersion;
            ErrorCorrectionLevel errorCorrectionLevel;
            byte[] finalMessageSequence = QRErrorCorrections.GetMessageSequence(binaryData, level, out qrCodeVersion, out errorCorrectionLevel);

            SymbolTemplate template = SymbolTemplate.CreateTemplate(qrCodeVersion);
            template.ErrorCorrectionLevel = errorCorrectionLevel;
            template.PopulateData(finalMessageSequence);
            template.Complete();

            return template.ToImage();
        }
        /// <summary>
        /// Inserts the text strings back into the game file.
        /// </summary>
        /// <returns>A value indicating whether the file was successfully saved.</returns>
        protected override bool SaveText()
        {
            this.tableOffsets[0] = this.headerData.Length;
            MemoryStream textStream = new MemoryStream();
            BinaryWriter textWriter = new BinaryWriter(textStream);

            int tableIndex = 0x06;

            for (int i = 0; i < this.strings.Length; i++)
            {
                // Skip the one string that's empty and contains no terminator.
                if (i != this.skipIndex)
                {
                    try
                    {
                        byte[] encodedBytes = this.encoding.GetBytes(this.strings[i]);
                        ushort length       = (ushort)encodedBytes.Length;
                        byte[] lengthBytes  = BitConverter.GetBytes(length);
                        Array.Copy(lengthBytes, 0, this.tableData[0], tableIndex, 2);
                        textWriter.Write(encodedBytes);
                    }
                    catch (InvalidDataException exc)
                    {
                        throw new InvalidDataException(String.Format("Unable to encode line {0} [{1}]: {2}", i, this.strings[i], exc.Message));
                    }
                }

                tableIndex += 0x08;
            }

            // Pad the text block with 00 until its size is a multiple of 16 bytes.
            textWriter.Flush();
            int padding = (int)((0x10 - (textStream.Length % 0x10)) % 0x10);

            for (int i = 0; i < padding; i++)
            {
                textWriter.Write((byte)0x00);
            }

            textWriter.Flush();
            this.textData[0] = textStream.ToArray();

            int headerIndex = 0x14;

            for (int i = 0; i < this.tableData.Length; i++)
            {
                this.tableOffsets[i] = (i == 0) ? this.headerData.Length : this.textOffsets[i - 1] + this.textData[i - 1].Length;
                this.textOffsets[i]  = this.tableOffsets[i] + this.tableData[i].Length;
                this.blockLengths[i] = this.tableData[i].Length + this.textData[i].Length;
                StreamHelper.WriteBytes(this.tableOffsets[i], this.headerData, headerIndex);
                StreamHelper.WriteBytes(this.textOffsets[i], this.headerData, headerIndex + 0x04);
                StreamHelper.WriteBytes(this.blockLengths[i], this.headerData, headerIndex + 0x08);
                headerIndex += 0x10;
            }

            MemoryStream contents = new MemoryStream();

            contents.Write(this.headerData, 0, this.headerData.Length);
            for (int i = 0; i < this.tableData.Length; i++)
            {
                contents.Write(this.tableData[i], 0, this.tableData[i].Length);
                contents.Write(this.textData[i], 0, this.textData[i].Length);
            }

            StreamHelper.WriteFile(this.GameFileName, contents.ToArray());

            return(true);
        }
Exemple #9
0
        public void Serialize(StreamHelper streamHelper)
        {
            //streamHelper.SeekTo(0x138);
            //if (!streamHelper.ReadAscii(4).Equals("mapv"))
            //{
            //    throw new Exception("expected mapv magic.");
            //}

            streamHelper.WriteInt32(_blf);
            streamHelper.WriteBytes(blfUnknown);

            streamHelper.WriteInt32(chdr);
            streamHelper.WriteBytes(chdrHeaderUnknown1);
            streamHelper.WriteUTF16(chdrHeaderName, 0x20);
            streamHelper.WriteAscii(chdrHeaderDescription, 0x80);
            streamHelper.WriteAscii(chdrHeaderAuthor, 0x10);
            streamHelper.WriteInt64(chdrHeaderSize);
            streamHelper.WriteInt64(chdrHeaderCreationDate);
            streamHelper.WriteInt64(chdrHeaderUnknown2);
            streamHelper.WriteInt32(chdrHeaderUnknown3);
            streamHelper.WriteInt32(chdrHeaderUnknown4);
            streamHelper.WriteInt32(chdrHeaderUnknown5);
            streamHelper.WriteInt32(chdrHeaderUnknown6);
            streamHelper.WriteInt32(chdrHeaderMapID);
            streamHelper.WriteInt32(chdrHeaderUnknown7);
            streamHelper.WriteInt32(chdrHeaderUnknown8);
            streamHelper.WriteBytes(chdrHeaderUnknown9);

            streamHelper.WriteInt32(mapv);
            streamHelper.WriteBytes(mapvHeaderUnknown1);
            streamHelper.WriteUTF16(mapvHeaderName, 0x20);
            streamHelper.WriteAscii(mapvHeaderDescription, 0x80);
            streamHelper.WriteAscii(mapvHeaderAuthor, 0x10);
            streamHelper.WriteInt64(mapvHeaderSize);
            streamHelper.WriteInt64(mapvHeaderCreationDate);
            streamHelper.WriteInt64(mapvHeaderUnknown2);
            streamHelper.WriteInt32(mapvHeaderUnknown3);
            streamHelper.WriteInt32(mapvHeaderUnknown4);
            streamHelper.WriteInt32(mapvHeaderUnknown5);
            streamHelper.WriteInt32(mapvHeaderUnknown6);
            streamHelper.WriteInt32(mapvHeaderMapID);
            streamHelper.WriteInt32(mapvHeaderUnknown7);
            streamHelper.WriteInt32(mapvHeaderUnknown8);
            streamHelper.WriteBytes(mapvHeaderUnknown9);

            streamHelper.WriteInt16(scnrObjectsCount);
            streamHelper.WriteInt16(totalObjectsCount);
            streamHelper.WriteInt16(budgetEntriesCount);
            streamHelper.WriteInt16(sandboxPlacementsCount);
            streamHelper.WriteInt32(mapID);
            streamHelper.WriteVector2(worldBoundsX);
            streamHelper.WriteVector2(worldBoundsY);
            streamHelper.WriteVector2(worldBoundsZ);
            streamHelper.WriteInt32(unknown1);
            streamHelper.WriteFloat(maxBudget);
            streamHelper.WriteFloat(currentBudget);
            streamHelper.WriteInt32(unknown2);
            streamHelper.WriteInt32(unknown3);

            foreach (SandboxPlacement placement in sandboxPlacements)
            {
                placement.Serialize(streamHelper);
            }

            streamHelper.WriteBytes(unknown4);

            foreach (BudgetEntry entry in budgetEntries)
            {
                entry.Serialize(streamHelper);
            }

            streamHelper.WriteBytes(unknownPad);

            streamHelper.WriteInt32(_eof);

            streamHelper.WriteBytes(unknown5);
            streamHelper.WriteBytes(emptyPad);
        }