Esempio n. 1
0
        public static DataFile LoadSounds(string ff7folder)
        {
            int      count = 0;
            DataFile df    = new DataFile()
            {
                Filename = System.IO.Path.Combine(ff7folder, "sound\\audio.dat")
            };

            using (var fmtFile = new System.IO.FileStream(System.IO.Path.Combine(ff7folder, "sound\\audio.fmt"), System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read)) {
                while (fmtFile.Position < fmtFile.Length)
                {
                    int length = fmtFile.ReadInt();
                    if (length == 0)
                    {
                        fmtFile.Seek(38, System.IO.SeekOrigin.Current);
                        continue;
                    }
                    df.Items.Add(new DataItem()
                    {
                        Name = "SOUND" + (count++), Length = length, Start = fmtFile.ReadInt()
                    });
                    fmtFile.Seek(66, System.IO.SeekOrigin.Current);
                }
            }
            return(df);
        }
Esempio n. 2
0
        public IrosArc(string filename, bool patchable = false, Action <int, int> progressAction = null)
        {
            _source = filename;
            var sw = new System.Diagnostics.Stopwatch();

            sw.Start();
            if (patchable)
            {
                _data = new System.IO.FileStream(filename, System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite);
            }
            else
            {
                _data = new System.IO.FileStream(filename, System.IO.FileMode.Open, System.IO.FileAccess.Read);
            }
            _header = new ArcHeader();
            _header.Open(_data);

            int numfiles;

            _data.Position = _header.Directory;
            do
            {
                numfiles = _data.ReadInt();
                if (numfiles == -1)
                {
                    _data.Position = _data.ReadLong();
                }
            } while (numfiles < 0);
            _entries     = new List <DirectoryEntry>();
            _lookup      = new Dictionary <string, DirectoryEntry>(StringComparer.InvariantCultureIgnoreCase);
            _folderNames = new HashSet <string>(StringComparer.InvariantCultureIgnoreCase);
            for (int i = 0; i < numfiles; i++)
            {
                progressAction?.Invoke(i, numfiles);
                DirectoryEntry e = new DirectoryEntry();
                e.Open(_data, _header.Version);
#if !RUDE
                if ((e.Flags & FileFlags.RudeFlags) != 0)
                {
                    throw new IrosArcException(String.Format("Archive {0} entry {1} has invalid flags", filename, e.Filename));
                }
#endif

                _entries.Add(e);
                _lookup[e.Filename] = e;
                int lpos = e.Filename.LastIndexOf('\\');
                if (lpos > 0)
                {
                    _folderNames.Add(e.Filename.Substring(0, lpos));
                }
            }
            sw.Stop();
            System.Diagnostics.Debug.WriteLine("IrosArc: opened {0}, contains {1} files, took {2} ms to parse", filename, _lookup.Count, sw.ElapsedMilliseconds);
        }