Example #1
0
 public NUB(DuplicatableStream duplicatableStream, EndianUtils.Endianness?e)
 {
     Stream          = duplicatableStream.Duplicate();
     Stream.Position = 0;
     Header          = new NubHeader(Stream, e);
     Endian          = Header.Endian;
     Stream.Position = Header.StartOfEntries;
     Entries         = Stream.ReadUInt32Array(Header.EntryCount, Endian);
 }
Example #2
0
        private static Stream RebuildNubStream(DuplicatableStream wstream, string nubdir, string nubtype, GetFilenameDelegate getFilenameDelegate)
        {
            MemoryStream outstream = new MemoryStream();

            EndianUtils.Endianness e = EndianUtils.Endianness.BigEndian;
            using (var stream = wstream.Duplicate()) {
                stream.Position = 0;
                var header = new HyoutaTools.Tales.Vesperia.NUB.NubHeader(stream, e);
                stream.Position = 0;
                StreamUtils.CopyStream(stream, outstream, header.StartOfFiles);
                stream.Position = header.StartOfEntries;
                uint[] entries = stream.ReadUInt32Array(header.EntryCount, e);
                for (long i = 0; i < entries.LongLength; ++i)
                {
                    uint entryLoc = entries[i];
                    if (nubtype == "bnsf")
                    {
                        using (var bnsfstream = new DuplicatableFileStream(Path.Combine(nubdir, getFilenameDelegate(i) + ".rawbnsf")))
                            using (var samplecountstream = new DuplicatableFileStream(Path.Combine(nubdir, getFilenameDelegate(i) + ".samplecount"))) {
                                // write file to outstream
                                long filestart = outstream.Position;
                                StreamUtils.CopyStream(bnsfstream, outstream, bnsfstream.Length);
                                outstream.WriteAlign(0x10);
                                long fileend = outstream.Position;
                                long filelen = fileend - filestart;

                                // update headers
                                outstream.Position = entryLoc + 0xbc + 0x4;
                                outstream.WriteUInt32((uint)(bnsfstream.Length + 0x28), e);
                                outstream.Position = entryLoc + 0xbc + 0x1c;
                                outstream.WriteUInt32((uint)(samplecountstream.ReadUInt64(EndianUtils.Endianness.LittleEndian)), e);
                                outstream.Position = entryLoc + 0xbc + 0x2c;
                                outstream.WriteUInt32((uint)(bnsfstream.Length), e);

                                outstream.Position = entryLoc + 0x14;
                                outstream.WriteUInt32((uint)filelen, e);
                                outstream.WriteUInt32((uint)(filestart - header.StartOfFiles), e);

                                outstream.Position = fileend;
                            }
                    }
                    else if (nubtype == "dsp")
                    {
                        using (var fs = new DuplicatableFileStream(Path.Combine(nubdir, getFilenameDelegate(i) + ".dsp"))) {
                            byte[] dspheader = fs.ReadUInt8Array(0x60);

                            // write file to outstream
                            long filestart = outstream.Position;
                            StreamUtils.CopyStream(fs, outstream, fs.Length - 0x60);
                            outstream.WriteAlign(0x10);
                            long fileend = outstream.Position;
                            long filelen = fileend - filestart;

                            // update headers
                            outstream.Position = entryLoc + 0xbc;
                            outstream.Write(dspheader);
                            outstream.Position = entryLoc + 0x14;
                            outstream.WriteUInt32((uint)filelen, e);
                            outstream.WriteUInt32((uint)(filestart - header.StartOfFiles), e);

                            outstream.Position = fileend;
                        }
                    }
                }

                long filesSize = outstream.Position - header.StartOfFiles;
                outstream.Position = 0x14;
                outstream.WriteUInt32((uint)filesSize, e);

                outstream.Position = 0;
                return(outstream);
            }
        }
Example #3
0
        public static void RebuildNub(DuplicatableStream duplicatableStream, string infolder, Stream outstream, EndianUtils.Endianness e)
        {
            outstream.Position = 0;
            using (var stream = duplicatableStream.Duplicate()) {
                stream.Position = 0;
                var header = new NubHeader(stream, e);

                // copy all header stuff to outstream, we'll modify it later
                stream.Position = 0;
                StreamUtils.CopyStream(stream, outstream, header.StartOfFiles);

                stream.Position = header.StartOfEntries;
                uint[] entries = stream.ReadUInt32Array(header.EntryCount, e);
                for (long i = 0; i < entries.LongLength; ++i)
                {
                    uint entryLoc = entries[i];
                    stream.Position = entryLoc;
                    uint type = stream.ReadUInt32(EndianUtils.Endianness.LittleEndian);

                    switch (type)
                    {
                    case 0x34317369: {
                        using (var fs = new DuplicatableFileStream(Path.Combine(infolder, i.ToString("D8") + ".bnsf"))) {
                            byte[] bnsfheader = fs.ReadUInt8Array(0x30);

                            // write file to outstream
                            long filestart = outstream.Position;
                            StreamUtils.CopyStream(fs, outstream, fs.Length - 0x30);
                            outstream.WriteAlign(0x10);
                            long fileend = outstream.Position;
                            long filelen = fileend - filestart;

                            // update headers
                            outstream.Position = entryLoc + 0xbc;
                            outstream.Write(bnsfheader);
                            outstream.Position = entryLoc + 0x14;
                            outstream.WriteUInt32((uint)filelen, e);
                            outstream.WriteUInt32((uint)(filestart - header.StartOfFiles), e);

                            outstream.Position = fileend;
                        }
                    }
                    break;

                    case 0x707364: {
                        using (var fs = new DuplicatableFileStream(Path.Combine(infolder, i.ToString("D8") + ".dsp"))) {
                            byte[] dspheader = fs.ReadUInt8Array(0x60);

                            // write file to outstream
                            long filestart = outstream.Position;
                            StreamUtils.CopyStream(fs, outstream, fs.Length - 0x60);
                            outstream.WriteAlign(0x10);
                            long fileend = outstream.Position;
                            long filelen = fileend - filestart;

                            // update headers
                            outstream.Position = entryLoc + 0xbc;
                            outstream.Write(dspheader);
                            outstream.Position = entryLoc + 0x14;
                            outstream.WriteUInt32((uint)filelen, e);
                            outstream.WriteUInt32((uint)(filestart - header.StartOfFiles), e);

                            outstream.Position = fileend;
                        }
                    }
                    break;

                    default:
                        Console.WriteLine("Unimplemented nub subtype (rebuild): 0x" + type.ToString("x8"));
                        break;
                    }
                }

                long filesSize = outstream.Position - header.StartOfFiles;
                outstream.Position = 0x14;
                outstream.WriteUInt32((uint)filesSize, e);
            }
        }