Beispiel #1
0
        public static string Combine(this IFileStorage fileStorage, params string[] paths)
        {
            var path = paths[0];

            for (int i = 1; i < paths.Length; i++)
            {
                path = fileStorage.Combine(path, paths[i]);
            }
            return(path);
        }
Beispiel #2
0
        public Disk(string directory)
        {
            _rncDecoder = new RncDecoder();

            _fileStorage = ServiceLocator.FileStorage;
            _platform    = ServiceLocator.Platform;
            var dataPath = _fileStorage.Combine(directory, DataFilename);

            _dataDiskFile = _fileStorage.OpenFileRead(dataPath);

            ReadEntries(directory);
        }
Beispiel #3
0
        private void ReadEntries(string directory)
        {
            var dinnerPath = _fileStorage.Combine(directory, DinnerFilename);

            using (var dinnerFile = _fileStorage.OpenFileRead(dinnerPath))
            {
                var dinnerReader = new BinaryReader(dinnerFile);
                _dinnerTableEntries = dinnerReader.ReadInt32();
                _entries            = new Dictionary <int, DiskEntry>();
                for (var i = 0; i < _dinnerTableEntries; i++)
                {
                    var id     = (int)dinnerReader.ReadUInt16();
                    var tmp    = dinnerReader.ReadUInt32();
                    var tmp2   = (uint)dinnerReader.ReadUInt16();
                    var offset = (int)(tmp & 0X0FFFFFF);
                    var cflag  = (byte)((offset >> 23) & 0x1) == 1;
                    offset &= 0x7FFFFF;
                    if (cflag)
                    {
                        var version = DetermineGameVersion();
                        if (version.Version.Minor == 331)
                        {
                            offset <<= 3;
                        }
                        else
                        {
                            offset <<= 4;
                        }
                    }
                    var flags        = (tmp2 << 8) | (tmp & 0xFF000000) >> 24;
                    var hasHeader    = ((flags >> 22) & 0x1) == 1;
                    var isCompressed = ((flags >> 23) & 0x1) == 0;
                    var size         = (int)(flags & 0x03fffff);
                    _entries.Add(id,
                                 new DiskEntry {
                        Offset = offset, HasHeader = hasHeader, IsCompressed = isCompressed, Size = size
                    });
                }
            }
        }