public VirtualFile(AfsFileEntry entry, string filePath) { Offset = entry.Offset; Length = entry.Length; FilePath = filePath; SetHandle(); }
public void addZone(int zoneNum, Stream zoneToAdd) { BinaryReader zoneLoader = new BinaryReader(zoneToAdd); byte[] loadedZone = zoneLoader.ReadBytes((int)zoneToAdd.Length); for (int i = 0; i < languages.Length; i++) { AfsFileEntry temp = new AfsFileEntry(); temp.rawContents = loadedZone; temp.fileName = "zone" + zoneNum.ToString("D2") + languages[i] + ".nbl"; temp.fileSize = (uint)loadedZone.Length; temp.fileContents = new NblLoader(new MemoryStream(temp.rawContents)); afsList.Add(temp); } }
/// <summary> /// Builds a virtual AFS based upon a supplied base AFS file. /// </summary> public VirtualAfs Build(string afsFilePath, int alignment = 2048) { // Get entries from original AFS file. var entries = GetEntriesFromFile(afsFilePath); var files = new Dictionary <int, VirtualFile>(entries.Length); // Get Original File List and Copy to New Header. var maxCustomFileId = _customFiles.Count > 0 ? _customFiles.Max(x => x.Key) + 1 : 0; var numFiles = Math.Max(maxCustomFileId, entries.Length); var newEntries = new AfsFileEntry[numFiles]; var headerLength = Utilities.RoundUp(sizeof(AfsHeader) + (sizeof(AfsFileEntry) * entries.Length), alignment); // Create new Virtual AFS Header for (int x = 0; x < entries.Length; x++) { var offset = x > 0 ? Utilities.RoundUp(newEntries[x - 1].Offset + newEntries[x - 1].Length, alignment) : entries[0].Offset; int length = 0; if (_customFiles.ContainsKey(x)) { length = _customFiles[x].Length; files[offset] = _customFiles[x]; } else { length = entries[x].Length; files[offset] = new VirtualFile(entries[x], afsFilePath); } newEntries[x] = new AfsFileEntry(offset, length); } var lastEntry = newEntries.Last(); var fileSize = Utilities.RoundUp(lastEntry.Offset + lastEntry.Length, alignment); // Make Header using var memStream = new ExtendedMemoryStream(headerLength); memStream.Append(AfsHeader.FromNumberOfFiles(newEntries.Length)); memStream.Append(newEntries); memStream.Append(new AfsFileEntry(0, 0)); memStream.AddPadding(alignment); return(new VirtualAfs(memStream.ToArray(), files, alignment, fileSize)); }
public void addFile(string filename, Stream toImport) { AfsFileEntry temp = new AfsFileEntry(); temp.fileName = filename; BinaryReader beta = new BinaryReader(toImport); toImport.Seek(0, SeekOrigin.Begin); temp.rawContents = beta.ReadBytes((int)toImport.Length); if (ASCIIEncoding.GetEncoding("ASCII").GetString(temp.rawContents, 0, 3) == "AFS") { temp.fileContents = new AfsLoader(new MemoryStream(temp.rawContents)); } else if (ASCIIEncoding.GetEncoding("ASCII").GetString(temp.rawContents, 0, 4) == "NMLL") { temp.fileContents = new NblLoader(new MemoryStream(temp.rawContents)); } afsList.Add(temp); }
public AfsLoader(Stream fileToLoad) { BinaryReader fileLoader = new BinaryReader(fileToLoad); fileToLoad.Seek(0, SeekOrigin.Begin); if (new string(Encoding.ASCII.GetChars(fileLoader.ReadBytes(4))) != "AFS\0") { return; } fileToLoad.Seek(4, SeekOrigin.Begin); int fileCount = fileLoader.ReadInt32(); afsList = new List <AfsFileEntry>(fileCount); for (int i = 0; i < fileCount; i++) { AfsFileEntry temp = new AfsFileEntry(); temp.location = fileLoader.ReadUInt32(); temp.fileSize = fileLoader.ReadUInt32(); afsList.Add(temp); } headerLoc = fileLoader.ReadUInt32(); headerSize = fileLoader.ReadUInt32(); fileToLoad.Seek(headerLoc, SeekOrigin.Begin); for (int i = 0; i < fileCount; i++) { afsList[i].fileName = new string(fileLoader.ReadChars(0x20)).TrimEnd('\0'); afsList[i].year = fileLoader.ReadUInt16(); afsList[i].month = fileLoader.ReadUInt16(); afsList[i].day = fileLoader.ReadUInt16(); afsList[i].hour = fileLoader.ReadUInt16(); afsList[i].minute = fileLoader.ReadUInt16(); afsList[i].second = fileLoader.ReadUInt16(); afsList[i].garbageInt = fileLoader.ReadUInt32(); } for (int i = 0; i < fileCount; i++) { fileToLoad.Seek(afsList[i].location, SeekOrigin.Begin); afsList[i].rawContents = fileLoader.ReadBytes((int)afsList[i].fileSize); } //subPaths = new AfsLoader[fileCount]; //nblContents = new NblLoader[fileCount]; for (int i = 0; i < fileCount; i++) { if (afsList[i].rawContents.Length > 3) { string headerName = ASCIIEncoding.GetEncoding("ASCII").GetString(afsList[i].rawContents, 0, 4); if (headerName.StartsWith("AFS")) { afsList[i].fileContents = new AfsLoader(new MemoryStream(afsList[i].rawContents)); } else if (headerName == "NMLL" || headerName == "NMLB") { afsList[i].fileContents = new NblLoader(new MemoryStream(afsList[i].rawContents)); } /* * if (ASCIIEncoding.GetEncoding("ASCII").GetString(afsData[i], 0, 3) == "AFS") * { * subPaths[i] = new AfsLoader(new MemoryStream(afsData[i])); * } * else if (ASCIIEncoding.GetEncoding("ASCII").GetString(afsData[i], 0, 4) == "NMLL") * { * nblContents[i] = new NblLoader(new MemoryStream(afsData[i])); * }*/ } } fileLoader.Close(); return; }