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); }
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); } }
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); } }