コード例 #1
0
        private CR2WBufferInfo WriteBuffer(BinaryWriter writer, RedBuffer buffer)
        {
            var result = new CR2WBufferInfo
            {
                flags   = buffer.Flags,
                offset  = (uint)writer.BaseStream.Position,
                memSize = buffer.MemSize
            };

            var compBuf = buffer.GetCompressedBytes();

            writer.Write(compBuf);

            result.diskSize = (uint)compBuf.Length;
            result.crc32    = Crc32Algorithm.Compute(compBuf);

            return(result);
        }
コード例 #2
0
        private void WriteBufferData(RedBuffer buffer)
        {
            if (buffer.Data is Package04 p4)
            {
                using var ms            = new MemoryStream();
                using var packageWriter = new PackageWriter(ms);

                packageWriter.WritePackage(p4, _file.RootChunk.GetType());

                var newData = ms.ToArray();

                /*var oldData = buffer.GetBytes();
                 * if (!oldData.SequenceEqual(newData))
                 * {
                 *  File.WriteAllBytes(@"C:\Dev\C77\Buffer\OldBuffer.bin", oldData);
                 *  File.WriteAllBytes(@"C:\Dev\C77\Buffer\NewBuffer.bin", newData);
                 * }*/

                buffer.SetBytes(newData);
            }
        }
コード例 #3
0
        public EFileReadErrorCodes ReadBuffer(RedBuffer buffer, Type fileRootType)
        {
            _hashService = Locator.Current.GetService <IHashService>();

            var _chunks = new List <RedBaseClass>();

            var result = new Package04();

            _outputFile = result;

            header.version = BaseReader.ReadUInt16();
            if (header.version < 2 || header.version > 4)
            {
                return(EFileReadErrorCodes.UnsupportedVersion);
            }

            header.numSections = _reader.ReadUInt16();
            if (header.numSections < 6 || header.numSections > 7)
            {
                return(EFileReadErrorCodes.UnsupportedVersion);
            }

            result.Version  = header.version;
            result.Sections = header.numSections;

            header.numComponents = _reader.ReadUInt32();

            if (header.numSections == 7)
            {
                header.refPoolDescOffset = _reader.ReadUInt32();
                header.refPoolDataOffset = _reader.ReadUInt32();
            }

            header.namePoolDescOffset = _reader.ReadUInt32();
            header.namePoolDataOffset = _reader.ReadUInt32();

            header.chunkDescOffset = _reader.ReadUInt32();
            header.chunkDataOffset = _reader.ReadUInt32();

            if (header.numSections == 7 && header.refPoolDescOffset != 0)
            {
                return(EFileReadErrorCodes.NoCr2w);
            }

            if (header.refPoolDescOffset != 0)
            {
                return(EFileReadErrorCodes.NoCr2w);
            }

            if (fileRootType == typeof(gamePersistentStateDataResource))
            {
                var numCruids = _reader.ReadUInt32();
                for (var i = 0; i < numCruids; i++)
                {
                    result.RootCruids.Add(_reader.ReadUInt64());
                }
            }
            else if (fileRootType != typeof(inkWidgetLibraryResource))
            {
                result.CruidIndex = _reader.ReadInt16();
                var numCruids = _reader.ReadUInt16();

                for (var i = 0; i < numCruids; i++)
                {
                    result.RootCruids.Add(_reader.ReadUInt64());
                }
            }

            var baseOff = BaseStream.Position;

            // read refs
            var refCount = (header.refPoolDataOffset - header.refPoolDescOffset) / 4;

            BaseStream.Position = baseOff + header.refPoolDescOffset;
            var refDesc = BaseStream.ReadStructs <Package04ImportHeader>(refCount);

            var readAsHash = fileRootType == typeof(appearanceAppearanceResource);

            foreach (var r in refDesc)
            {
                BaseStream.Position = baseOff + r.offset;
                importsList.Add(ReadImport(r, readAsHash));
            }

            // read strings
            var nameCount = (header.namePoolDataOffset - header.namePoolDescOffset) / 4;

            BaseStream.Position = baseOff + header.namePoolDescOffset;
            var nameDesc = BaseStream.ReadStructs <Package04NameHeader>(nameCount);

            foreach (var s in nameDesc)
            {
                BaseStream.Position = baseOff + s.offset;
                _namesList.Add(ReadName(s));
            }

            // read chunks
            var chunkCount = (header.chunkDataOffset - header.chunkDescOffset) / 8;

            BaseStream.Position = baseOff + header.chunkDescOffset;
            var chunkDesc = BaseStream.ReadStructs <Package04ChunkHeader>(chunkCount);

            for (var i = 0; i < chunkDesc.Length; i++)
            {
                _chunks.Add(ReadChunk(chunkDesc[i]));
            }

            var newChunks = new List <RedBaseClass>();

            for (var i = 0; i < _chunks.Count; i++)
            {
                if (!HandleQueue.ContainsKey(i))
                {
                    newChunks.Add(_chunks[i]);
                    continue;
                }

                foreach (var handle in HandleQueue[i])
                {
                    handle.SetValue(_chunks[i]);
                }
            }

            result.Chunks = newChunks;

            buffer.Data = result;

            return(EFileReadErrorCodes.NoError);
        }