Example #1
0
        /// <summary>
        /// Write the file.
        /// </summary>
        /// <param name="w">The writer.</param>
        public override void Write(FileWriter w)
        {
            //Init file.
            w.InitFile <XFileHeader>(FType ? "FSEQ" : "CSEQ", ByteOrder, Version, 2);

            //Data block.
            w.InitBlock("DATA", blockType: 0x5000);
            w.Write(RawData);
            w.Align(0x20);
            w.CloseBlock();

            //Label block.
            w.InitBlock("LABL", blockType: 0x5001);
            w.Write((uint)Labels.Count);
            for (int i = 0; i < Labels.Count; i++)
            {
                w.InitReference <XReference <object> >("Labl" + i);
            }
            for (int i = 0; i < Labels.Count; i++)
            {
                w.CloseReference("Labl" + i, 0x5100);
                w.Write(new LabelEntry()
                {
                    Offset = Labels.Values.ElementAt(i), Str = Labels.Keys.ElementAt(i)
                });
            }
            w.Align(0x20);
            w.CloseBlock();

            //Close file.
            w.CloseFile();
        }
Example #2
0
            public override void Write(FileWriter writer, LayoutHeader header)
            {
                long startPos = writer.Position - 8;

                writer.Write(AnimationOrder);
                writer.Write((ushort)Groups.Count);
                writer.Write(uint.MaxValue); //animNameOffset
                writer.Write(uint.MaxValue); //groupNamesOffset
                if (header.VersionMajor >= 8)
                {
                    writer.Write(0); //unk
                }
                writer.Write((ushort)StartFrame);
                writer.Write((ushort)EndFrame);

                writer.Write(ChildBinding);
                writer.Write(UnknownData);

                writer.WriteUint32Offset(startPos + 12, startPos);
                writer.WriteString(Name);
                writer.Align(4);

                writer.WriteUint32Offset(startPos + 16, startPos);
                for (int i = 0; i < Groups.Count; i++)
                {
                    writer.WriteString(Groups[i], 0x14);
                }

                writer.Align(4);
            }
Example #3
0
        /// <summary>
        /// Write the archive.
        /// </summary>
        /// <param name="w">The writer.</param>
        public override void Write(FileWriter w)
        {
            //Write the archive.
            w.Write("DARC".ToCharArray());
            w.Align(0x10);

            //Info block.
            w.Write("INFO".ToCharArray());
            w.Write((uint)Files.Count);
            for (int i = 0; i < Files.Count; i++)
            {
                w.Write(Files.Keys.ElementAt(i));
                w.InitOffset("Offset" + i);
                w.InitOffset("Size" + i);
                w.Write(PackedFiles.Contains(Files.Keys.ElementAt(i)));
            }

            //Data block.
            w.Align(0x10);
            w.Write("DATA".ToCharArray());
            for (int i = 0; i < Files.Count; i++)
            {
                w.CloseOffset("Offset" + i);
                w.StartStructure();
                w.Write(Files.Values.ElementAt(i));
                w.CloseOffset("Size" + i);
                w.EndStructure();
            }
        }
Example #4
0
        public void Save(System.IO.Stream stream)
        {
            using (var writer = new FileWriter(stream))
            {
                writer.Write(uint.MaxValue); //header size
                writer.Write(uint.MaxValue); //file size
                writer.Write(files.Count);
                for (int i = 0; i < files.Count; i++)
                {
                    writer.Write(files[i].Hash);
                    writer.Write(uint.MaxValue); //start offset
                    writer.Write(uint.MaxValue); //end offset
                }
                writer.Align(128);

                writer.WriteUint32Offset(0, 4); //Size of header - 4
                for (int i = 0; i < files.Count; i++)
                {
                    files[i].SaveFileFormat();

                    writer.WriteUint32Offset(20 + (i * 16)); //start offset
                    writer.Write(files[i].FileData);
                    writer.WriteUint32Offset(24 + (i * 16)); //end offset

                    writer.Align(8);
                }
                using (writer.TemporarySeek(4, SeekOrigin.Begin)) {
                    writer.Write((int)writer.BaseStream.Length);
                }
            }
        }
Example #5
0
        public override void Write(FileWriter writer, HsfFile header)
        {
            var meshes = header.Meshes.Where(x => x.TexCoords.Count > 0).ToList();

            long posStart = writer.Position;

            foreach (var mesh in meshes)
            {
                writer.Write(header.GetStringOffset(mesh.Name));
                writer.Write(mesh.TexCoords.Count);
                writer.Write(uint.MaxValue);
            }

            long dataPos = writer.Position;

            for (int i = 0; i < meshes.Count; i++)
            {
                meshes[i].ObjectData.TexCoordIndex = i;

                writer.Align(0x20);
                writer.WriteUint32Offset(posStart + 8 + (i * 12), dataPos);
                for (int j = 0; j < meshes[i].TexCoords.Count; j++)
                {
                    writer.Write(meshes[i].TexCoords[j]);
                }
            }
            writer.Align(4);
        }
Example #6
0
        public void Write(FileWriter writer, FFNT Header)
        {
            long pos = writer.Position;

            if (BinaryTextureFile != null)
            {
                var mem = new System.IO.MemoryStream();
                BinaryTextureFile.Save(mem);
                SheetDataList[0] = mem.ToArray();
            }

            writer.WriteSignature("TGLP");
            writer.Write(uint.MaxValue);
            writer.Write(CellWidth);
            writer.Write(CellHeight);
            writer.Write((byte)SheetDataList.Count);
            writer.Write(MaxCharWidth);
            writer.Write(SheetDataList[0].Length);
            writer.Write(BaseLinePos);
            writer.Write(Format);
            writer.Write(ColumnCount);
            writer.Write(RowCount);
            writer.Write(SheetWidth);
            writer.Write(SheetHeight);
            long _ofsSheetBlocks = writer.Position;

            writer.Write(uint.MaxValue);

            if (Header.Platform == FFNT.PlatformType.NX)
            {
                writer.Align(4096);
            }
            else
            {
                writer.Align(8192);
            }

            long DataPosition = writer.Position;

            using (writer.TemporarySeek(_ofsSheetBlocks, SeekOrigin.Begin))
            {
                writer.Write((uint)DataPosition);
            }

            for (int i = 0; i < SheetDataList.Count; i++)
            {
                writer.Write(SheetDataList[i]);
            }


            long SectionEndPosition = writer.Position;

            //End of section. Set the size
            using (writer.TemporarySeek(pos + 4, SeekOrigin.Begin))
            {
                writer.Write((uint)(SectionEndPosition - pos));
            }
        }
 private void SetAlignment(FileWriter writer, string FileName)
 {
     if (FileName.EndsWith(".gmx"))
     {
         writer.Align(0x40);
     }
     else if (FileName.EndsWith(".gtx"))
     {
         writer.Align(0x2000);
     }
     else
     {
         writer.Write(DefaultAlignment);
     }
 }
Example #8
0
        public override void Write(FileWriter writer, LayoutHeader header)
        {
            long startPos = writer.Position - 8;

            base.Write(writer, header);
            writer.Write(Properties.Count);
            writer.Write(MagnifyX);
            writer.Write(MagnifyY);

            for (int i = 0; i < Properties.Count; i++)
            {
                Properties[i].Write(writer, header, startPos);
            }

            writer.WriteString(LayoutFileName);
            writer.Align(4);

            //  for (int i = 0; i < Properties.Count; i++)
            //     Properties[i].WriteProperties(writer, header, startPos);

            //   for (int i = 0; i < Properties.Count; i++)
            //      Properties[i].WriteUserData(writer, header, startPos);

            for (int i = 0; i < Properties.Count; i++)
            {
                Properties[i].WriteProperties(writer, header, startPos);
                Properties[i].WriteUserData(writer, header, startPos);
                Properties[i].WritePaneInfo(writer, header, startPos);
            }
        }
Example #9
0
        public void WriteEffectNormals(FileWriter writer, HsfFile header)
        {
            if (Meshes.Count == 0)
            {
                return;
            }

            List <EffectMesh> readMeshes = new List <EffectMesh>();

            var ObjectsSorted = Objects.OrderBy(x => x.VertexIndex).ToList();

            for (int i = 0; i < ObjectsSorted.Count; i++)
            {
                if (ObjectsSorted[i].VertexIndex >= 0 && Meshes.Count > ObjectsSorted[i].VertexIndex)
                {
                    var effectMesh = Meshes[ObjectsSorted[i].VertexIndex];
                    int index      = Objects.IndexOf(ObjectsSorted[i]);
                    if (!readMeshes.Contains(effectMesh))
                    {
                        writer.Align(0x20);
                        effectMesh.NormalOffset = (uint)writer.Position;
                        for (int j = 0; j < effectMesh.Normals.Count; j++)
                        {
                            writer.Write(effectMesh.Normals[j]);
                        }

                        readMeshes.Add(effectMesh);
                    }
                    var obj = Objects[index];
                    obj.NormalsOffset = (int)effectMesh.NormalOffset;
                }
            }
        }
Example #10
0
            public void WriteBlock(FileWriter writer, int DataAlignment = 0)
            {
                //From the block size goto where the data will start
                writer.Seek((int)(BlockSize + headerPos), SeekOrigin.Begin);

                //Add alignment if necessary
                if (DataAlignment != 0)
                {
                    writer.Align(DataAlignment);
                }

                var blockPos = writer.Position;

                //Satisfy the offset
                using (writer.TemporarySeek(headerPos + 16, SeekOrigin.Begin))
                {
                    //Offset starts from the block header
                    writer.Write(blockPos - headerPos);
                }

                writer.Write(Data);

                //Set the total size
                uint TotalDataSize = (uint)(writer.Position - blockPos);

                using (writer.TemporarySeek(headerPos + 8, SeekOrigin.Begin)) {
                    writer.Write((ulong)TotalDataSize);
                }
            }
Example #11
0
        public void Write(FileWriter writer)
        {
            writer.WriteSignature("GFLXPACK");
            writer.Write(version);
            writer.Write(0);
            writer.Write(files.Count);
            writer.Write(FolderCount);
            long FileInfoOffset = writer.Position;

            writer.Write(0L);
            long HashArrayOffset = writer.Position;

            writer.Write(0L);
            long folderArrOffset = writer.Position;

            //Reserve space for folder offsets
            for (int f = 0; f < FolderCount; f++)
            {
                writer.Write(0L);
            }

            //Now write all sections
            writer.WriteUint64Offset(HashArrayOffset);
            foreach (var fileTbl in files)
            {
                writer.Write(fileTbl.FilePathHash);
            }

            //Save folder sections
            List <long> FolderSectionPositions = new List <long>();

            foreach (var folder in folders)
            {
                FolderSectionPositions.Add(writer.Position);
                folder.Write(writer);
            }
            //Write the folder offsets back
            using (writer.TemporarySeek(folderArrOffset, SeekOrigin.Begin))
            {
                foreach (long offset in FolderSectionPositions)
                {
                    writer.Write(offset);
                }
            }

            //Now file data
            writer.WriteUint64Offset(FileInfoOffset);
            foreach (var fileTbl in files)
            {
                fileTbl.Write(writer);
            }

            //Save data blocks
            foreach (var fileTbl in files)
            {
                fileTbl.WriteBlock(writer);
            }

            writer.Align(16);
        }
Example #12
0
            public void Write(FileWriter writer)
            {
                writer.WriteSignature(Magic);
                if (Magic == "EFCC")
                {
                    writer.ByteOrder = Syroot.BinaryData.ByteOrder.LittleEndian;
                }
                else
                {
                    writer.ByteOrder = Syroot.BinaryData.ByteOrder.BigEndian;
                }

                writer.Write(Version);
                writer.Write((ushort)Entries.Count);
                writer.Write((ushort)StringEntries.Count);
                writer.Write((ushort)0);

                for (int i = 0; i < Entries.Count; i++)
                {
                    Entries[i].Write(writer);
                }
                for (int i = 0; i < StringEntries.Count; i++)
                {
                    writer.Write(StringEntries[i]);
                    writer.Align(2);
                }
            }
Example #13
0
        internal void Write(FileWriter writer)
        {
            writer.ByteOrder = Syroot.BinaryData.ByteOrder.LittleEndian;
            writer.Write(Encoding.ASCII.GetBytes("AAMP"));
            writer.Write(Version);
            writer.Write(Endianness);

            long sizeOffset = writer.Position;

            writer.Write(0); //Write the file size later
            writer.Write(ParameterIOVersion);
            writer.Write(AlignUp(ParameterIOType.Length + 1, 4));
            writer.Write(ParameterIOType, Syroot.BinaryData.BinaryStringFormat.ZeroTerminated);
            writer.Align(4);

            ParamListV1.Write(RootNode, writer);

            //Write end of file
            writer.Seek(sizeOffset, System.IO.SeekOrigin.Begin);
            uint FileSize = (uint)writer.BaseStream.Length;

            writer.Write(FileSize);

            writer.Close();
            writer.Dispose();
        }
Example #14
0
            public void Write(FileWriter writer)
            {
                writer.WriteSignature("VFXB");
                writer.Write(0x20202020);
                writer.Write(GraphicsAPIVersion);
                writer.Write(VFXVersion);
                writer.Write(ByteOrderMark);
                writer.Write(Alignment);
                writer.Write(TargetOffset);
                writer.Write(32);
                writer.Write(Flag);
                writer.Write(BlockOffset);
                writer.Write(0);
                long _ofsFileSize = writer.Position;

                writer.Write(0);
                writer.Seek(BlockOffset, SeekOrigin.Begin);

                foreach (var section in Sections)
                {
                    writer.Align(8);
                    section.Write(writer, this);
                }

                using (writer.TemporarySeek(_ofsFileSize, SeekOrigin.Begin))
                {
                    writer.Write(writer.BaseStream.Length);
                }

                writer.Flush();
                writer.Close();
                writer.Dispose();
            }
Example #15
0
 public void Write(FileWriter writer)
 {
     writer.Write(ElementCount);
     writer.Write(DataType, true);
     writer.Write(Stride);
     writer.Write(Unknown1);
     writer.Write(BufferData);
     writer.Align(4);
 }
Example #16
0
 public virtual void Write(FileWriter writer, Header header)
 {
     writer.WriteSignature(Signature);
     writer.Write(Data.Length);
     writer.Write(Padding);
     writer.Write(EntryCount);
     writer.Write(Data);
     writer.Align(16);
 }
Example #17
0
 public override void Write(FileWriter writer, HsfFile header)
 {
     for (int i = 0; i < Attributes.Count; i++)
     {
         var mat = Attributes[i];
         mat.NameOffset = (uint)header.GetStringOffset(AttributeNames[i]);
         writer.WriteStruct(mat);
     }
     writer.Align(4);
 }
Example #18
0
        public override void Write(FileWriter writer, HsfFile header)
        {
            long startPos = writer.Position;

            for (int i = 0; i < Palettes.Count; i++)
            {
                writer.WriteStruct(Palettes[i]);
            }

            long dataPos = writer.Position;

            for (int i = 0; i < Palettes.Count; i++)
            {
                writer.Align(0x20);
                writer.WriteUint32Offset(startPos + 12 + (i * 16), dataPos);
                writer.Write(PaletteData[i]);
            }
            writer.Align(4);
        }
Example #19
0
 public void Write(FileWriter w)
 {
     w.Write((ushort)0x1F00);
     w.Write((ushort)0);
     w.Write(Offset);
     w.Write(Str.Length);
     w.Write(Str.ToCharArray());
     w.Write((byte)0);
     w.Align(0x4);
 }
Example #20
0
 public override void Write(FileWriter writer, HsfFile header)
 {
     for (int i = 0; i < header.Materials.Count; i++)
     {
         var mat = header.Materials[i];
         mat.MaterialData.NameOffset = (uint)header.GetStringOffset(mat.Name);
         writer.WriteStruct(mat.MaterialData);
     }
     writer.Align(4);
 }
Example #21
0
        public override void Write(FileWriter writer, HsfFile header)
        {
            var meshes = header.Meshes.Where(x => x.Positions.Count > 0).ToList();

            long posStart = writer.Position;

            foreach (var mesh in meshes)
            {
                writer.Write(header.GetStringOffset(mesh.Name));
                writer.Write(mesh.Normals.Count);
                writer.Write(uint.MaxValue);
            }

            if (meshes.Count == 1)
            {
                TypeFlag = DataType.Sbyte;
            }

            long dataPos = writer.Position;

            for (int i = 0; i < meshes.Count; i++)
            {
                meshes[i].ObjectData.NormalIndex = i;

                writer.Align(0x20);
                writer.WriteUint32Offset(posStart + 8 + (i * 12), dataPos);
                for (int j = 0; j < meshes[i].Normals.Count; j++)
                {
                    if (TypeFlag == DataType.Sbyte)
                    {
                        writer.Write((sbyte)(meshes[i].Normals[j].X * sbyte.MaxValue));
                        writer.Write((sbyte)(meshes[i].Normals[j].Y * sbyte.MaxValue));
                        writer.Write((sbyte)(meshes[i].Normals[j].Z * sbyte.MaxValue));
                    }
                    else
                    {
                        writer.Write(meshes[i].Normals[j]);
                    }
                }
            }
            writer.Align(4);
        }
Example #22
0
            public void Write(FileWriter writer)
            {
                writer.SetByteOrder(IsBigEndian);
                if (IsV1)
                {
                    writer.Write(Images.Count);
                    for (int i = 0; i < Images.Count; i++)
                    {
                        ((ImageHeaderV1)Images[i].Header).Write(writer);
                    }

                    AlignBytesIncrement(writer, 32);
                    for (int i = 0; i < Images.Count; i++)
                    {
                        writer.WriteUint32Offset(8 + (i * 0x10));
                        writer.Write(Images[i].ImageData);
                    }
                }
                else
                {
                    writer.Write(0x0020AF30);
                    writer.Write(Images.Count);
                    writer.Write(0x0C); //Offset always 12

                    //Reserve space for palette and header offsets
                    writer.Write(new byte[Images.Count * 8]);

                    //Then write the palettes first
                    for (int i = 0; i < Images.Count; i++)
                    {
                        if (Images[i].PaletteHeader != null)
                        {
                            writer.WriteUint32Offset(16 + (i * 8));
                            Images[i].PaletteHeader.Write(writer);
                        }
                    }

                    //Then write the headers
                    long imageHeaderPos = writer.Position;
                    for (int i = 0; i < Images.Count; i++)
                    {
                        writer.WriteUint32Offset(12 + (i * 8));
                        ((ImageHeaderV2)Images[i].Header).Write(writer);
                    }

                    //Then write the data
                    for (int i = 0; i < Images.Count; i++)
                    {
                        writer.Align(64);
                        writer.WriteUint32Offset(imageHeaderPos + 8 + (i * 0x24));
                        writer.Write(Images[i].ImageData);
                    }
                }
            }
        public void Write(FileWriter writer)
        {
            byte format = FormatList.FirstOrDefault(x => x.Value == Format).Key;

            writer.Write(format);
            writer.Write(Padding);
            writer.Write(Width);
            writer.Write(Height);
            writer.Align(32);
            writer.Write(ImageData);
        }
Example #24
0
        public override void Write(FileWriter writer, HsfFile header)
        {
            long texpos = writer.Position;

            for (int i = 0; i < header.Textures.Count; i++)
            {
                var tex = header.Textures[i].TextureInfo;
                tex.NameOffset = (uint)header.GetStringOffset(header.Textures[i].Name);
                writer.WriteStruct(tex);
            }

            long datapos = writer.Position;

            for (int i = 0; i < header.Textures.Count; i++)
            {
                writer.Align(0x20);
                writer.WriteUint32Offset(texpos + 28 + (i * 32), datapos);
                writer.Write(header.Textures[i].ImageData);
            }
            writer.Align(8);
        }
Example #25
0
 public void Save(Stream stream)
 {
     using (var writer = new FileWriter(stream)) {
         writer.SetByteOrder(true);
         writer.WriteStruct(ImageHeader);
         writer.Align(32);
         writer.Write(ImageData);
         if (((GamecubeSwizzle)Platform).PaletteData.Length > 0)
         {
             writer.Write(((GamecubeSwizzle)Platform).PaletteData);
         }
     }
 }
Example #26
0
            public byte[] AlignData(byte[] data)
            {
                using (var mem = new MemoryStream(data))
                {
                    using (var writer = new FileWriter(mem))
                    {
                        writer.Write(data);
                        writer.Align((int)Alignment);

                        return(mem.ToArray());
                    }
                }
            }
Example #27
0
 public void WriteUserData(FileWriter writer, LayoutHeader header, long startPos)
 {
     if (UserData != null)
     {
         writer.WriteUint32Offset(_ofsPos + 4, startPos);
         long pos = writer.Position;
         writer.WriteSignature("usd1");
         writer.Write(uint.MaxValue);
         UserData.Write(writer, header);
         writer.Align(4);
         writer.WriteSectionSizeU32(pos + 4, pos, writer.Position);
     }
 }
Example #28
0
 public void Save(System.IO.Stream stream)
 {
     using (var writer = new FileWriter(stream))
     {
         writer.Write((ushort)Width);
         writer.Write((ushort)Height);
         writer.Write(Unknown);
         ushort format = FormatsTXE.FirstOrDefault(x => x.Value == Format).Key;
         writer.Write(format);
         writer.Write(ImageData.Length);
         writer.Align(32);
         writer.Write(ImageData);
     }
 }
Example #29
0
        /// <summary>
        /// Write the sequence file.
        /// </summary>
        /// <param name="w">The writer.</param>
        public override void Write(FileWriter w)
        {
            //Init file.
            w.InitFile <RFileHeader>("RSEQ", ByteOrder.BigEndian, new RVersion()
            {
                Major = 1, Minor = 0
            }, 2);

            //Data block.
            w.InitBlock("DATA");
            w.Write((uint)0xC);
            w.Write(RawData);
            w.Align(0x20, true);
            w.CloseBlock();

            //Label block.
            w.InitBlock("LABL");
            w.Write((uint)Labels.Count);
            for (int i = 0; i < Labels.Count; i++)
            {
                w.InitOffset("label" + i);
            }
            for (int i = 0; i < Labels.Count; i++)
            {
                w.CloseOffset("label" + i);
                w.Write(Labels.Values.ElementAt(i));
                w.Write((uint)Labels.Keys.ElementAt(i).Length);
                w.Write(Labels.Keys.ElementAt(i).ToCharArray());
                w.Write((byte)0);
                w.Align(4, true);
            }
            w.Align(0x20, true);
            w.CloseBlock();

            //Close file.
            w.CloseFile();
        }
Example #30
0
        private byte[] CreateBuffer(List <byte[]> imageData)
        {
            var mem = new MemoryStream();

            using (var writer = new FileWriter(mem))
            {
                for (int i = 0; i < imageData.Count; i++)
                {
                    if (i > 0)
                    {
                        writer.Align(Alignment);
                    }
                    writer.Write(imageData[i]);
                }
                return(mem.ToArray());
            }
        }