コード例 #1
0
 public VirtualFile(AfsFileEntry entry, string filePath)
 {
     Offset   = entry.Offset;
     Length   = entry.Length;
     FilePath = filePath;
     SetHandle();
 }
コード例 #2
0
        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);
            }
        }
コード例 #3
0
        /// <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));
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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;
        }